加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 22:56:14 所属栏目:安全 来源:网络整理
导读:我有一个Web服务器,我运行一些慢启动程序作为守护进程.当我重新编译它们或切换到它们的另一个安装时,这些有时需要快速重启(或停止). 灵感来自http://mywiki.wooledge.org/ProcessManagement,我正在写一个剧本 称为daemonise.sh,看起来像 #!/bin/shwhile :; d
我有一个Web服务器,我运行一些慢启动程序作为守护进程.当我重新编译它们或切换到它们的另一个安装时,这些有时需要快速重启(或停止).

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

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

保持“守护进程”运行.因为我有时需要阻止它,或者只是
重启它,我在屏幕会话中运行该脚本,如:

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

然后也许我重新编译myprogram,将它安装到一个新的路径,然后开始
新的一个,想杀死旧的:

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

当我是唯一的维护者时,这很好用,但现在我想让它
别人停止/重新启动程序,无论是谁启动它.和
事实上,使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

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

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

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

解决方法

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读