让其他用户停止/重启简单的bash守护进程 - 使用信号还是什么?

unh*_*mer 6 bash signals daemon process

我有一个Web服务器,我运行一些慢启动程序作为守护进程.当我重新编译它们或切换到它们的另一个安装时,这些有时需要快速重启(或停止).

灵感来自http://mywiki.wooledge.org/ProcessManagement,我正在写称为脚本daemonise.sh,看起来像

#!/bin/sh
while :; do
    ./myprogram lotsadata.xml
    echo "Restarting server..." 1>&2
done
Run Code Online (Sandbox Code Playgroud)

保持"守护进程"运行.由于我有时需要停止它,或者只是重新启动它,我在屏幕会话中运行该脚本,如:

$ ./daemonise.sh & DPID=$!
$ screen -d
Run Code Online (Sandbox Code Playgroud)

然后也许我重新编译我的程序,将它安装到一个新的路径,启动新的路径并想要杀死旧路径:

$ screen -r
$ kill $DPID
$ screen -d
Run Code Online (Sandbox Code Playgroud)

当我是唯一的维护者时,这很好用,但现在我想让其他人停止/重新启动程序,无论是谁启动它.daemonise.sh事实上,为了使事情变得更复杂,脚本实际上会启动大约16个程序,如果你不知道它们的PID,那么杀死每一个程序都会很麻烦.

让另一个用户停止/重启守护进程的"最佳实践"方法是什么?

我想过共享屏幕会话,但这听起来很丑陋和不安全.我现在提出的最好的解决方案是在捕获某些信号的脚本中包装起始和终止:

#!/bin/bash
DPID=
trap './daemonise.sh & DPID=$!' USR1
trap 'kill $DPID' USR2 EXIT

# Ensure trapper wrapper doesn't exit:
while :; do
    sleep 10000 & wait $!
done
Run Code Online (Sandbox Code Playgroud)

现在,如果另一个用户需要停止守护进程而我不能这样做,她只需要知道包装器的pid,例如sudo kill -s USR2 $wrapperpid.(此外,这使得可以在重新启动时运行守护进程,并且仍然可以干净地杀死守护进程.)

有更好的解决方案吗?我没有看到这个解决方案存在明显的问题吗?

(在阅读了Greg的Bash Wiki之后,我想避免任何涉及pgrep或PID文件的解决方案......)

rec*_*bot 1

我推荐一个基于 PID 的初始化脚本。任何拥有该脚本 sudo 权限的人都可以启动和停止服务器进程。