gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:01:04 24 4
gpt4 key购买 nike

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

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

#!/bin/sh
while :; do
./myprogram lotsadata.xml
echo "Restarting server..." 1>&2
done

保持“守护进程”运行。因为我有时需要停止它,或者只是重新启动它,我在屏幕 session 中运行该脚本,例如:

$ ./daemonise.sh & DPID=$!
$ screen -d

然后也许我重新编译我的程序,把它安装到一个新的路径,开始新的起来想杀掉旧的:

$ screen -r
$ kill $DPID
$ screen -d

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

让其他用户使用的“最佳实践”方式是什么停止/重启守护进程?

我考虑过共享屏幕 session ,但这听起来很老套而且没有安全感。我现在想到的最好的解决方案是包装在捕获特定信号的脚本中启动和终止:

#!/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

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

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

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

最佳答案

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

关于bash - 让其他用户停止/重启简单的 bash 守护进程——使用信号还是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9433452/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com