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
.
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.
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
.
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"
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.
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
Tags nohup shell-script