验证拒绝命令


10

我发布了该^z; bg; disown序列,以便允许我关闭一个ssh会话,在该会话中我正在运行一个非常重要的长期运行的进程。此过程将状态输出写入stderr,即使分离后仍继续这样做(已通过lsof验证,stderr fd对r / w打开)。

有没有办法确定该进程确实已被取消(如果shell撤消了,则将不会撤消SIGHUP)?


1
我想知道是否需要去unix.stackexchange.com
Rilindo 2011年

2
只是好奇,为什么不这样做:$ PROCESS 1 >> / root / std.out 2 >> / root / err.out&
Avery Payne

Answers:


12

在Bash中,disown由其本身发出的命令将从活动作业表中删除后台进程(通过bg&),并将其标记为在注销时不接收SIGHUP。

您也可以通过一项或多项工作来取消工作,例如disown 1 3disown -h如果您要将作业保留在表中,但在注销时仍不是SIGHUP,则该标志很有用。

您可以通过发出jobs命令来查看作业表。成功获得背景后,它将显示[1]+ command &。放弃作业后,该作业将不再显示在作业表中,也不再在注销时被杀死。您仍然可以通过查看的过程中ps uxtop其他工艺观看公用事业和。

取消作业后,您可以等待其自然终止,或通过信号发送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,然后决定需要注销而不会终止该命令。如果您知道将要运行命令并注销,则可以通过管道输出或将其输出tee到文件中,使用nohup,运行或在screen其中运行来捕获输出(这使您可以重新获得命令的所有权/之后终止) )。

例子:

# 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

1
+1内容丰富,并附有示例。真好!
安迪·史密斯

非常翔实的评论;您是说无法验证流程的分离性(除了注意到作业表中不再存在该分离性)?
mikewaters 2011年

1
当您detach在后台执行任务时,它会变得分离:)在后台进程中执行该操作实际上没有任何中间立场。检查jobs只是验证您没有尝试分离已停止的进程或其他东西。
lunixbochs 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.