我发了^ z; BG; disown序列,以便允许我关闭一个ssh会话,在该会话中我运行一个超级重要的长期运行进程.此过程将状态输出写入stderr,并且即使在分离之后它仍继续这样做(使用lsof验证,stderr fd对于r / w是打开的).
有没有办法确定该进程确实已被否定(如果shell收回一个进程,则不会收回SIGHUP)?
在
Bash中,自己发出的disown命令将从活动作业表中删除后台(通过bg或&)进程,并将它们标记为在注销时不接收SIGHUP.
原文链接:https://www.f2er.com/bash/385830.html您还可以将一个或多个作业传递给disown,例如disown 1 3.如果要在表中保留作业,但在注销时仍然不是SIGHUP,则disown -h标志很有用.
您可以通过发出jobs命令来查看作业表.在成功的背景之后,它将显示[1]命令&.在取消作业后,它不应再显示在作业表中,并且在注销时不再被杀死.您仍然可以通过ps ux,top和其他流程查看实用程序查看该过程.
在作业被取消后,您可以等待它自然终止或通过kill向PID发送信号以停止它.
因为Bash只是从正在运行的作业列表中删除作业以终止并且终端的stdout和stderr的文件句柄仍然打开,所以您将继续接收作业的输出,直到您的终端设备关闭(当您注销时) .
例子:
# we start a command in the background $cat /dev/urandom > test & [1] 18533 # we see our command is still running $jobs [1]+ Running cat /dev/urandom > test & # we disown the backgrounded job $disown 1 # notice it is no longer in the job table $jobs
我通常只使用disown,如果我运行一个可能长时间运行的命令,如rsync或cp,然后决定我需要注销而不终止它.如果您知道要运行命令并注销,则可以通过管道输入或将其发送到文件,使用nohup运行或在屏幕中运行(可以重新获得命令的所有权/之后终止).
例子:
# capture stdout and stderr to separate logs cat /dev/urandom >stdout.log 2>stderr.log # capture stdout and stderr to the same log,and display to stdout as well cat /dev/urandom 2>&1 | tee output.log # run a command under nohup (doesn't require a disown or job control support) nohup cat /dev/urandom </dev/null