bash:作为新生子级通过分叉过程守护进程



我有一个 bash 脚本,它在运行后应该会自行守护。我的解决方案如下所示:

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

但是,将整个脚本本身放在函数child中似乎不是正确的做法。 不幸的是,exec &不会将整个过程分叉到一个有背景的孩子身上。

如何才能达到预期的效果?

我通常会做这样的事情:

#!/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,以避免混淆大多数 *nix 系统上的 /bin/bash/bin/sh 并不相同。

相关内容

  • 没有找到相关文章

最新更新