bash:通过分叉进程作为新进程进行守护进程 child
bash: daemonizing by forking process as a new child
我有一个 bash 脚本,它应该在 运行 之后 守护进程 自身。我的解决方案如下所示:
#!/bin/sh -xe
child() {
echo child
}
child & # fork child
echo parent
kill $$ # kill parent
但是,将整个脚本本身放在函数 child
中似乎不是正确的做法。不幸的是 exec &
不会 fork-off 整个过程进入后台 child。
怎样才能达到预期的效果?
我经常这样做:
#!/bin/bash
if [ -z "$_IS_DAEMON" ]; then
_IS_DAEMON=1 /bin/bash [=10=] "$@" &
exit
fi
echo "I'm a deamon!"
脚本在后台有效地自行重启,同时退出用户启动的脚本。
为了识别守护进程status,它使用了一个环境变量(上面例子中的$_IS_DAEMON
):如果没有设置,假设由用户启动;如果设置,则假定作为守护进程的一部分启动。
为了重新启动自身,脚本只需调用 [=12=] "$@"
:[=13=]
是用户启动的脚本名称,"$@"
是传递给的参数脚本,保留了空格和所有内容(与 $*
不同)。我通常也会显式调用 needed shell,以避免混淆 /bin/bash
和 /bin/sh
,它们在大多数 *nix 系统上并不相同。
我有一个 bash 脚本,它应该在 运行 之后 守护进程 自身。我的解决方案如下所示:
#!/bin/sh -xe
child() {
echo child
}
child & # fork child
echo parent
kill $$ # kill parent
但是,将整个脚本本身放在函数 child
中似乎不是正确的做法。不幸的是 exec &
不会 fork-off 整个过程进入后台 child。
怎样才能达到预期的效果?
我经常这样做:
#!/bin/bash
if [ -z "$_IS_DAEMON" ]; then
_IS_DAEMON=1 /bin/bash [=10=] "$@" &
exit
fi
echo "I'm a deamon!"
脚本在后台有效地自行重启,同时退出用户启动的脚本。
为了识别守护进程status,它使用了一个环境变量(上面例子中的$_IS_DAEMON
):如果没有设置,假设由用户启动;如果设置,则假定作为守护进程的一部分启动。
为了重新启动自身,脚本只需调用 [=12=] "$@"
:[=13=]
是用户启动的脚本名称,"$@"
是传递给的参数脚本,保留了空格和所有内容(与 $*
不同)。我通常也会显式调用 needed shell,以避免混淆 /bin/bash
和 /bin/sh
,它们在大多数 *nix 系统上并不相同。