Eu deixei um script em execução em uma máquina remota desde quando eu estava trabalhando localmente. Posso conectar-me via SSH à máquina como o mesmo usuário e ver o script sendo executado ps
.
$ ps aux | grep ipcheck
myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh
É simplesmente a saída para stdout em uma sessão local (corri de ./ipchecker.sh
uma janela de terminal local, sem redirecionamento, sem uso de screen
etc).
Existe alguma maneira de uma sessão SSH que eu possa ver a saída desse comando em execução (sem pará-lo)?
Até agora, o melhor que encontrei é o de usar, strace -p 18386
mas recebo hordas de texto voando pela tela, é muito detalhado. Eu posso parar strace
e peneirar a saída e encontrar o texto impresso em stdout, mas é muito longo e confuso e, obviamente, enquanto está parado, eu posso perder alguma coisa. Gostaria de encontrar uma maneira de ver a saída do script ao vivo como se estivesse trabalhando localmente.
Alguém pode melhorar isso? A resposta óbvia é reiniciar o script com redirecionamento ou em uma screen
sessão, etc., este não é um script de missão crítica, para que eu possa fazer isso. No entanto, vejo isso como um divertido exercício de aprendizado.
fonte
strace -p 4232 -e write
Respostas:
Se tudo que você quer fazer é espionar o processo existente, você pode usar
strace -p1234 -s9999 -e write
onde 1234 é o ID do processo. (-s9999
evita ter cadeias de caracteres truncadas em 32 caracteres ewrite
a chamada do sistema que produz saída.) Se você deseja exibir apenas dados gravados em um descritor de arquivo específico, pode usar algo comostrace -p1234 -e trace= -e write=3
ver apenas os dados gravados no descritor de arquivo 3 (-e trace=
impede o sistema chamadas sejam registradas). Isso não fornecerá a saída que já foi produzida.Se a saída estiver rolando muito rápido, você poderá direcioná-la para um pager como
less
, ou enviá-lo para um arquivo comstrace -o trace.log …
.Em muitos programas, você pode desviar a saída subsequente com um ptrace hack, para o seu terminal atual ou para uma nova sessão de tela. Consulte Como posso negar um processo em execução e associá-lo a um novo shell de tela? e outros threads vinculados.
Observe que, dependendo de como seu sistema está configurado, pode ser necessário executar todos esses
strace
comandos como root, mesmo que o processo esteja sendo executado no seu usuário sem privilégios adicionais. (Se o processo estiver sendo executado como um usuário diferente ou for setuid ou setgid, você precisará executarstrace
como root.) A maioria das distribuições permite apenas que um processo rastreie seus filhos (isso fornece um benefício moderado à segurança - evita a injeção direta de malware, mas não impede a injeção indireta modificando arquivos). Isso é controlado pelokernel.yama.ptrace_scome
sysctl.fonte
man strace
Você pode acessar a saída através do
proc
sistema de arquivos.1
= stdout,2
= stderrfonte
/dev/null
) - só funcionará se a saída for redirecionada para um arquivo.ping google.es
e em outra como root:tail -f /proc/`pgrep ping`/fd/2
e nada é mostrado.No BSD, você pode usar
watch
quais espiões um determinado tty, por exemplo,No Linux, não será possível se o processo não tiver sido executado no multiplexador antes, como
screen
outmux
. Consulte também: Reptyr: anexar um processo em execução a um novo terminalParece que a única maneira para depurar é o processo (por exemplo
strace
,dtrace
/dtruss
,gdb
,lldb
, etc.).Como você utilizou
strace
, para buscar qualquer saída significativa, é necessário filtrar por uma expressão qualificada (comofile
) e analisar a saída. Aqui está um exemplo:O que ele faz: imprime a operação de gravação do processo (comprimento 1000) especificada pelo PID (use
pgrep
para encontrá-lo pelo nome), redireciona o erro padrão para a saída (a ser filtrada) e imprime uma string com aspas duplas.Se você estiver lidando com saída binária, poderá analisar os caracteres das seqüências de escape usando
read
(com-r
) eprintf
(com%b
), por exemploVerifique se
help read
há mais parâmetros (por exemplo,-n
para imprimir após uma certa quantidade de caracteres, em vez de nova linha).Aqui está um exemplo mais completo:
Para exemplos usando qualquer processo, verifique: Como analisar strace no shell em texto sem formatação? no stackoverflow
fonte
Você pode espiar a tela remota usando
ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scale
ondelocalhost
deve ser substituído pelas credenciais de login do servidor remoto e:0.0
pelo número de exibição da sua GUI.Use
x11vnc
, que é um servidor VNC para a sua sessão X na tela.Ao executar em um dos 6 consoles virtuais
sudo setterm -dump 2 -file /dev/stdout
, tente substituí-lo2
pelo vc apropriado.fonte
Eu aconselho a fazer um pipe nomeado (
mkfifo
) e depois gravar nesse arquivo. Então, leia a partir dele. Você sempre pode fazer isso com coisas comotail
minimizar a saída etc. Sempre que você limpa o tubo (leia a partir dele), ele é limpo, para que a saída não seja preservada.A outra opção seria gravar tudo em um arquivo (como um arquivo de log) e analisá-lo a qualquer momento. Essa seria a ação preferida, se você quiser preservar toda a saída.
fonte
Você sempre pode iniciar um processo com nohup e &
Em seguida, você pode verificar o progresso de qualquer tty com:
Isso funciona bem para mim.
fonte
Uma maneira muito simples de obter a saída seria capturar sua saída em um arquivo e segui-lo.
SE FAZER: ./ipcheck
EM VEZ DE: ./ipcheck> [replaceewithyourfilename]
Isso criaria um arquivo de saída onde seu script está localizado. Em qualquer outro shell bash, você pode simplesmente ajustar o arquivo:
tail [replaceewithyourfilename] -f
fonte
setbuf(3)
), o que pode tornar umtail
problema.Analisando a saída do strace:
Usei a resposta principal (com meu ID de processo de 28223) ...
Para determinar que eu me importo
write(9
. (O 9 é usado abaixo, provavelmente é um identificador de arquivo e pode ser diferente para o seu processo.) Em seguida, escrevi um rápido script Ruby para analisá-los e exibi-los.Cole o seguinte em
/usr/bin/parse_strace.rb
Não esqueça
chmod a+x /usr/bin/parse_strace.rb
Eu invoco
strace -xx
(gera hexadecimal, para que o regex corresponda corretamente), canalizando (incluindo STDERR) para o meu script com9
o primeiro argumento.E, voilá, ele produz o STDOUT original do processo, novas linhas, cores e tudo!
fonte
você não pode obter o ID do processo e se comunicar com ele com USR1,
que imprime o PID do seu script e use-o para
Entendo que USR1 é um sinal "definido pelo usuário", o que significa que quem criou o programa pode usá-lo para "desligar" ou "despejar seus logs" ou "imprimir milhares de vezes" ou o que for.
fonte