【问题标题】:How do I handle stopping my service?如何处理停止我的服务?
【发布时间】:2017-07-28 11:07:42
【问题描述】:

我已经将我编写的程序变成了服务,并且我有一个 bash 脚本可以运行以启动实际程序,因为有些事情必须以特定的顺序启动。启动脚本的内容(在 init.d 脚本中使用 start-stop-daemon 调用,如下所示:

./rfid_reader &
sleep 2
java ReaderClass &

这很好用,但是当需要停止进程时,我该如何杀死它们? 我见过使用 pidfiles,我只是获取两个程序的 PID,将它们写入文件,然后在需要关闭它们时将它们杀死,还是我必须 ps -ef | grep program 获取它们的 PID?

【问题讨论】:

  • pid1=$(pidof program_name) && pid2=$(pidof other_name) && kill $pid1 $pid2 怎么样?或者只是kill $(pidof program_name) $(pidof other_name)
  • 这些工作,我想有一个标准的方法,我想这是标准的方法
  • 标准是调用与/etc/rc.d/initfile start 相同的/etc/rc.d/initfile stop 守护进程(或systemctl stop prog_name 调用systemd 世界中的停止服务)
  • 好的,在停止函数中我使用kill program_name
  • 如果您在initfile 世界中,只需从/etc/rc.d 复制现有的初始化文件并修改/重命名它以适合您的服务,以便它在您的 state 目录中提供一个 pid 文件 当您准备停止守护程序时,将通过调用/etc/rc.d/your_prog stop 将其杀死。您可以对 systemd 服务文件执行相同的操作,尽管在制作 systemd 服务文件时需要考虑更多规则。

标签: bash init.d


【解决方案1】:

假设您知道程序的名称,您可以按如下方式杀死它们:

killall -KILL program_name

【讨论】:

  • -KILL?真的吗?这是您所在地区的正常做法吗?
  • 为了避免混淆,可能需要明确指出 programprogram_name
  • 是的,program_name 也有效,正如 Brydon 最初所说的 ps -ef | grep 程序我想为了一致性起见重复它
  • 不是最好的解决方案,但不需要获取程序的PID
  • @IgnacioVazquez-Abrams :我应该避免使用 -KILL 选项吗?
【解决方案2】:

我不认为killall 这样做是个好主意。最好将后台启动的程序的PID记录在某个文件中(如PID_FILE),然后kill $(<$PID_FILE)停止。

之前启动的后台程序PID获取方法请参考this thread

【讨论】:

  • @BrydonGibson 很高兴为您提供帮助 :-)
  • 除了UUOC(不必要地使用cat)可以替换为kill $(<$PID_FILE)
  • @DavidC.Rankin 感谢您的建议,更新了答案。
  • 当然,这是一个很好的学习机会。任何时候你发现自己想做cat whatever,如果你实际上不是连接文件,那么可能有更合适的方法来做:)
  • 我还用谷歌搜索了porkmail.org/era/unix/award.html,发现我在日常工作中使用了很多 UUOx。非常好的博客阅读并再次感谢您:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 2015-10-09
  • 2011-10-26
相关资源
最近更新 更多