bash:作为一个新孩子通过分叉过程进行守护

时间:2016-05-25 08:43:56

标签: linux bash daemon

我有一个bash脚本,在运行后应该 daemonize 。我的解决方案如下:

#!/bin/sh -xe
child() {
    echo child
}
child & # fork child
echo parent
kill $$ # kill parent

但是,将整个脚本本身放在函数child中似乎不正确。不幸的是,exec &不会将整个过程分成一个背景儿童。

如何达到预期效果?

1 个答案:

答案 0 :(得分:2)

我通常做这样的事情:

#!/bin/bash

if [ -z "$_IS_DAEMON" ]; then
    _IS_DAEMON=1 /bin/bash $0 "$@" &
    exit
fi

echo "I'm a deamon!"

脚本在后台有效地重新启动,同时退出用户启动的脚本。

要识别守护进程状态,它使用环境变量(上例中的$_IS_DAEMON):如果未设置,则假定由用户启动;如果设置,则假设作为守护进程的一部分开始。

要重新启动,脚本只需调用$0 "$@"$0是用户启动的脚本名称,"$@"是传递给脚本的参数,用白色空格和所有(与$*不同)保存。我还通常明确地调用所需的shell,以避免/bin/bash/bin/sh之间的混淆,这些混淆在大多数* nix系统上都不相同。