4

我想要一种在 shell 脚本中编写守护程序的方法,它在循环中运行另一个应用程序,如果它死了就重新启动它。

  • 当使用./myscript.shSSH 会话运行时,它将启动一个新的守护进程实例,除非守护进程已经在运行。
  • 当 SSH 会话结束时,守护进程将继续存在。
  • 应该有一个参数(./myscript -stop)杀死任何现有的守护进程。

编辑注意事项- 原始问题指定nohup不得使用类似工具。这种人为要求是“XY问题”,而接受的答案实际上使用了OP声称无法使用的所有工具。)

4

2 回答 2

6

根据评论中的说明,您真正想要的是一个守护进程,它可以让子进程保持运行,并在它退出时重新启动它。您想要一种在 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脚本可以使用一个参数来杀死守护进程。查看系统初始化脚本中的示例以获得更完整的示例以及更好的错误检查。

于 2012-08-19T12:25:03.450 回答
2

最近“后台”进程的 pid 存储在$!

$ cat &
[1] 7057
$ echo $!
7057

我不知道forkbash 中的命令。你确定 bash 是适合这项工作的工具吗?

于 2012-08-19T11:58:30.647 回答