【问题标题】:Custom shell script to kill uWSGI by pid通过 pid 杀死 uWSGI 的自定义 shell 脚本
【发布时间】:2014-03-01 06:07:27
【问题描述】:

我要编写一个脚本,该脚本将从文件 (/tmp/pidfile.txt) 中获取所有文本,该文件只是一个 pid 号,然后将其存储为变量(例如 pidvar)或其他内容并执行以下命令:

kill -2 pidvar 

看起来很简单,我只是不知道如何从 .t​​xt 文件中获取 pid。如果这有帮助,我已经安装了 python。尝试使杀死 uWSGI 变得更容易,欢迎任何关于替代方案的建议。

提前感谢您的帮助。

【问题讨论】:

    标签: shell centos sh uwsgi


    【解决方案1】:

    要求 uwsgi 杀死自己通常更容易。您可以通过在配置中使用“master-fifo”选项来执行此操作,然后向 fifo 发送“q”。此处对此进行了描述:http://uwsgi-docs.readthedocs.org/en/latest/MasterFIFO.html

    【讨论】:

      【解决方案2】:

      您的问题的字面答案(使用 bash 扩展会更有效)是

      kill -2 "$(</tmp/pidfile.txt)"
      

      ...或者,与 POSIX sh 兼容但效率略低...

      kill -2 "$(cat /tmp/pidfile.txt)"
      

      ...但不要这样做。


      pidfile 容易出现竞争条件,而基于进程树的监督系统可以保证它们只向正确的进程传递信号。

      runitdaemontoolsUpstartsystemd 和许多其他可供选择的方法可以保证不会有基于陈旧数据向错误进程发送信号的风险。 CentOS 可能是最后一个附带其中之一的主要操作系统(尽管未来的版本几乎肯定会使用 systemd),但它们可以作为第三方软件包提供——如果你如果希望您的系统可靠(例如,检测意外故障并在服务出现故障时立即重新启动服务,而不必使用您自己的代码),您应该使用其中之一。

      例如,使用 systemd:

      systemctl kill -s SIGINT uwsgi.service
      

      ...或者,使用 runit:

      sv interrupt uwsgi
      

      ...而对于 upstart,您可以配置一个完全任意的重启命令以在 initctl reload uwsgi 上触发。


      有关使用 shell 脚本进行进程管理的一般最佳实践文档,请参阅the wooledge.org wiki, maintained by irc.freenode.org's #bash channel 上的相应页面。

      【讨论】:

      • 非常感谢您富有洞察力的回复。我将使用 runit,这将使事情变得更容易并且我的系统更可靠。我是这里的新手,感谢您的指导。 (我会投票赞成你的答案,但我没有足够的代表)
      • @EVAunit01 很高兴这对您有所帮助!虽然它不包含 uwsgi 的常规运行脚本,但smarden.org/runit/runscripts.html 的页面应该可以帮助您入门(如您所见,运行脚本几乎总是只有一两行——比初始化脚本容易得多)。顺便说一句,即使您不能投票,您也可以将答案标记为已接受(通常,这样做本身就值得一些声誉点)。
      猜你喜欢
      • 1970-01-01
      • 2017-08-04
      • 2013-11-11
      • 1970-01-01
      • 1970-01-01
      • 2013-03-26
      • 2020-11-30
      • 2020-03-02
      • 2014-11-24
      相关资源
      最近更新 更多