Bash Shell自动运行耗时作业

你在后台运行了一项作业,然后退出 shell,出去喝了杯咖啡。回来检查时发现作业已经停止运行,而且还未完成。实际上,该作业压根就没有完成多少。你退出 shell 时,它似乎也跟着退出了。

解决方案

如果想在后台运行作业并在该作业完成前退出 shell,那就需要对作业使用 nohup。

$ nohup long &
nohup: appending output to `nohup.out'
$

讨论

将作业置入后台时(通过前面介绍过的 &),它仍旧是 bash shell 的子进程。如果退出 shell 的某个实例,bash 就会向其所有子进程发送 hangup 信号。这就是作业运行不了多久的原因。只要退出 bash,后台作业就会被“杀死”。(嗨,你要离开了。它是怎么知道的呢?)

nohup 命令只是设置子进程忽略 hangup 信号。你仍可以用 kill 命令“杀死”作业,因为 kill 发送的是 SIGTERM 信号,而非 SIGHUP 信号。但有了 nohup,作业就不会在退出 bash 时被无意间“杀死”。

nohup 给出的那句关于追加输出的消息只是为了提高自身的实用性。因为你有可能发出 nohup 命令后就退出 shell,输出信息也就无处可去了,也就是说,终端中的 bash 会话已经结束,作业无法再向 STDOUT 写入。更重要的是,向不存在的位置写入信息会产生错误。因此,nohup 会替你重定向输出,将其追加(不是覆盖,而是添加到文件现有内容的末尾)到当前目录下的 nohup.out 文件中。你也可以明确地在命令行上指定将输出重定向到其他地方,nohup 足够聪明,能够发现你已经另有安排,也就不会再使用 nohup.out 了。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!