是否可以运行 nohup 并且仍然在屏幕上看到详细输出

是否可以运行 nohup 并且仍然在屏幕上看到详细输出

我有一个相当简单的 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

相关内容