我有一个相当简单的 shell 脚本补丁文件(本质上,一些脚本加上 rpm 都在一个文件中)。它工作得很好,但我遇到了一些意想不到的事情:用户在运行过程中意外关闭了 ssh 会话。最终结果是旧包没有被删除。
最初的问题现已解决,但它让我思考——是否有一种简单的方法可以让脚本继续运行,即使 ssh 会话终止,并且仍然通过 ssh 会话向用户提供状态更新?我没有使用的最初原因nohup
是因为我认为它隐藏/抑制了我希望用户可见的输出。当脚本运行时,我希望用户看到状态更新等。
答案1
我会做这样的事情:
nohup command > command.out 2>&1 & tail -f command.out
请记住,虽然tail
除非被杀死否则永远不会退出,但它会永远等待-f
。
答案2
正如已经建议的那样,使用-f
标志来连续tail
读取nohup.out
文件。另一种可能性是与 named pipes
.
例子:
# 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
另一个例子 -dbus-monitor
连续运行并不断输出到named pipe
.请注意上一个命令的剩余输出。可能需要清除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"
答案3
开始一个屏幕会议。在 Screen 会话中运行大部分脚本,该会话将在脚本完成后退出。 (可选)在屏幕会话完成后,打印出成功/失败报告。
如果用户断开连接(自愿或非自愿),脚本将继续不受阻碍地运行。只要用户不断开连接,他们就会继续看到脚本的输出,并可以与其交互(例如,使用Ctrl+终止它C)。如果他们确实断开连接,他们甚至可以通过重新附加 Screen 会话来重新连接。
答案4
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