É possível executar nohup e ainda ver a saída detalhada na tela

3

Eu tenho um arquivo de correção de script de shell bastante simples (em essência, alguns scripts mais rpms em um único arquivo). Ele funciona muito bem, mas eu encontrei algo que não esperava: um usuário acidentalmente fechou a sessão ssh enquanto estava no meio da execução dela. O resultado final foi que os pacotes mais antigos não foram excluídos.

O problema inicial agora está resolvido, mas isso me fez pensar - existe uma maneira fácil de manter um script funcionando mesmo que uma sessão ssh seja encerrada E ainda forneça atualizações de status para o usuário por meio da sessão ssh? O motivo inicial pelo qual eu não usei nohup foi porque eu pensei que ele escondia a saída que eu queria que fosse visível para o usuário. Enquanto o script está em execução, quero que o usuário veja atualizações de status e tal.

    
por Mike B 12.11.2015 / 22:40

4 respostas

3

Eu faria algo assim:

nohup command > command.out 2>&1 & tail -f command.out

Lembre-se de que tail nunca sairá, a menos que seja morto, e continuará aguardando para sempre -f .

    
por 12.11.2015 / 22:46
3

Como já foi sugerido, use -f flag de tail para ler o arquivo nohup.out continuamente. Outra possibilidade seria com named pipes .

Exemplo:

# make a named pipe first
xieerqi@eagle:~$ mkfifo /tmp/mypipe
# redirect command there
xieerqi@eagle:~$ nohup bash -c "while [  1 ] ; do df > /tmp/mypipe ; sleep 3;done  " &
[1] 14425
xieerqi@eagle:~$ nohup: ignoring input and appending output to ‘nohup.out’

# Now cat the pipe

xieerqi@eagle:~$ cat /tmp/mypipe
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda1      115247656 83099216  26271092  76% /
none                   4        0         4   0% /sys/fs/cgroup
udev             2914492        4   2914488   1% /dev
tmpfs             585216     1152    584064   1% /run
none                5120        0      5120   0% /run/lock
none             2926072    98008   2828064   4% /run/shm
none              102400       76    102324   1% /run/user

Outro exemplo - dbus-monitor é executado continuamente e mantém a saída para o named pipe . Observe a saída residual do comando anterior. Talvez precise ser limpo com echo "" > /tmp/mypipe

xieerqi@eagle:~$ nohup  dbus-monitor  > /tmp/mypipe  &
[1] 14695
xieerqi@eagle:~$ cat /tmp/mypipe 
nohup: ignoring input and redirecting stderr to stdout
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda1      115247656 83099512  26270796  76% /
none                   4        0         4   0% /sys/fs/cgroup
udev             2914492        4   2914488   1% /dev
tmpfs             585216     1152    584064   1% /run
none                5120        0      5120   0% /run/lock
none             2926072    98012   2828060   4% /run/shm
none              102400       76    102324   1% /run/user
signal sender=org.freedesktop.DBus -> dest=:1.115 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
   string ":1.115"
method call sender=:1.115 -> dest=org.freedesktop.DBus serial=3 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
   string "eavesdrop=true,type='method_call'"
method call sender=:1.115 -> dest=org.freedesktop.DBus serial=4 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
   string "eavesdrop=true,type='method_return'"
method call sender=:1.115 -> dest=org.freedesktop.DBus serial=5 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=AddMatch
   string "eavesdrop=true,type='error'"
signal sender=org.freedesktop.DBus -> dest=(null destination) serial=99 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameOwnerChanged
   string ":1.116"
   string ""
   string ":1.116"
    
por 14.11.2015 / 23:30
2

Inicie uma sessão de Tela . Execute a maior parte do script dentro de uma sessão de tela, que será encerrada quando o script for concluído. Opcionalmente, após a conclusão da sessão de tela, imprima um relatório de sucesso / falha.

Se o usuário se desconectar (voluntariamente ou não), o script continuará sendo executado sem impedimentos. Enquanto o usuário não se desconectar, ele continuará vendo a saída do script e poderá interagir com ele (por exemplo, para eliminá-lo com Ctrl + C . Se eles forem desconectados , eles podem até se reconectar ao reconectar a sessão de tela.

    
por 13.11.2015 / 01:31
1
nohup ls -l
#nohup: ignoring input and appending output to ‘nohup.out’
#total 44
#-rw-r--r-- 1 mikeserv mikeserv 2550 Nov  3 15:03 file
#-rw-r--r-- 1 mikeserv mikeserv   10 Nov 10 06:36 file1.tsv
#-rw-r--r-- 1 mikeserv mikeserv   10 Nov 10 06:36 file1.txt
#-rw-r--r-- 1 mikeserv mikeserv   10 Nov 10 06:36 file2.tsv
#-rw-r--r-- 1 mikeserv mikeserv   10 Nov 10 06:36 file2.txt
#-rw-r--r-- 1 mikeserv mikeserv    5 Nov 11 09:06 filea.xyz
#-rw-r--r-- 1 mikeserv mikeserv    5 Nov 11 09:06 fileb.xyz
 lrwxrwxrwx 1 mikeserv mikeserv    8 Nov 14 19:56 nohup.out -> /dev/tty
#drwxr-xr-x 2 mikeserv mikeserv   80 Nov 13 17:31 one
    
por 15.11.2015 / 05:01