10.1 “守护”你的脚本

10.1 “Daemon-izing” Your Script

问题

有时你想让一个脚本以“守护”方式在后台运行,且永不结束。想要完美达到此目的,你需要将脚本与其受控 TTY 分离——即,从启动守护程序的终端会话中分离脚本。简单地在命令之后放一个“&”是不够的。如果你通过 SSH (或类似的)会话在远程系统上启动你的守护脚本,你会注意到,当你登出时,SSH 会话并未结束,而且直到脚本结束前窗口一直处于挂起状态(也即它并非以守护方式运行)。

解决方案

使用以下命令调用脚本,并且可以在后台运行它的同时仍然允许你登出:

或:

讨论

你若要关闭受控的 TTY (终端),则需要断开以下三种与你的(或任何其它)作业相连接的途径:即通过标准输入(STDIN)、标准输出(STDOUT)和标准错误(STDERR)。我们可以通过将 STDOUT 和 STDERR 指向另外的文件,来达到关闭它们俩的目的——通常情况下,另外的文件要么是日志文件,以便我们能够在稍后查阅输出,要么是 /dev/null,也即丢弃所有输出。我们可以使用重定向操作符“>”来达到此目的。

但是,STDIN 怎么办?处理 STDIN 的最简洁的办法就是关闭这个文件描述符。bash 中这么做的语法类似于重定向,只不过在文件名后跟了一条横线(0<&-  或 <&-)。

我们使用 “nohup” 命令是为了我们登出时不会因“hangup”信号中断脚本运行。

在第一个例子中,我们在三个重定向中严格地使用了文件描述符(例如,0,1,2)。不过 STDIN 和 STDOUT 的文件描述符可以不写,所以我们的第二个例子中没有严格使用文件描述符。我们还把第二条命令的输入重定向放到了结尾而不是开头,这是因为此处文件描述符之间的顺序并不重要。(然而,顺序还是很重要的,而且重定向 STDERR 时文件描述符数字必须写明。)

参见

  • 第二章和第三章中更多关于重定向输出和输入的内容。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据