我想要一种在shell脚本中编写守护进程的方法,它在循环中运行另一个应用程序,如果它死了就重新启动它。
./myscript.sh
运行时,它将启动守护程序的新实例,除非该守护程序已在运行。./myscript -stop
)可以杀死任何现有的守护进程。( 关于编辑的说明 - 原始问题指出nohup
和类似工具可能不会被使用。这个人为要求是一个“XY问题”,并且接受的答案实际上使用了OP声称无法使用的所有工具。)
答案 0 :(得分:5)
根据评论中的说明,您真正想要的是一个让孩子保持运行的守护进程,并在它退出时重新启动它。您想要一种在ssh会话中键入“./myscript.sh”并启动守护程序的方法。
#!/usr/bin/env bash
PIDFILE=~/.mydaemon.pid
if [ x"$1" = x-daemon ]; then
if test -f "$PIDFILE"; then exit; fi
echo $$ > "$PIDFILE"
trap "rm '$PIDFILE'" EXIT SIGTERM
while true; do
#launch your app here
/usr/bin/server-or-whatever &
wait # needed for trap to work
done
elif [ x"$1" = x-stop ]; then
kill `cat "$PIDFILE"`
else
nohup "$0" -daemon
fi
运行脚本:它将使用nohup为您启动守护进程。守护进程是一个循环,它监视子进程退出,然后重新启动它。
要控制守护进程,脚本可以使用-stop
参数来终止该守护进程。查看系统初始化脚本中的示例,以获得更完整的错误检查示例。
答案 1 :(得分:1)
最近“后台”流程的pid存储在$!
$ cat &
[1] 7057
$ echo $!
7057
我不知道bash中的fork
命令。你确定bash是这项工作的合适工具吗?