【问题标题】:Bash to start and kill process on Ubuntu in a given periodBash 在给定时间内在 Ubuntu 上启动和终止进程
【发布时间】:2018-09-06 18:02:38
【问题描述】:

我有这种情况:我有一个在 ubuntu 终端(xfce4-terminal)上作为控制台/进程运行的 php 脚本(在 php 中有一个带有某些进程的循环)。 问题是:由于内存过度使用,该进程每两天就会被杀死。 我需要的是:一个可以启动进程的 bash 脚本,每 48 小时它会杀死该进程并重新启动它。

【问题讨论】:

  • 如果您的进程运行 48 小时,您想解释一下哪个进程需要这么长时间并且需要定期重新启动吗?这听起来像是一个不寻常的过程
  • 您没有将其配置为 systemd 服务有什么原因吗?如果它作为服务运行,它将在启动时自动启动,在它死后重新启动,并且您可以设置一个计时器以在需要时触发显式重新启动只需配置一个最大值它被允许使用的内存,当它超过这个最大值时让它死掉并重新启动。
  • ...也就是说,编写一个bash脚本首先是解决这个问题的错误方法。
  • 我同意@RiggsFolly 的观点。听起来像“我有一辆汽车,交流发电机每周都会熄灭。我需要制造一台机器,每周六更换我汽车的交流发电机来解决这个问题”。内存泄漏可以修复吗?是否有另一种方法可以使用 cron 和 shell 或其他方法来执行此 php 脚本正在执行的操作...?
  • 我认为这是解决问题的情况,而不是解决症状

标签: bash ubuntu


【解决方案1】:

最佳解决方案是修复内存泄漏,跟踪泄漏函数并在需要帮助时使用相关代码发布新问题。

现在对于这种特定情况,您可以使用如下内容:

while true
do 
  timeout 12h php myfile.php
done

这是一个无限循环,它会启动您的命令并在 12 小时后将其终止。 (或您想要的任何其他持续时间:30m、1d 等)

更稳定的解决方案是创建 systemd 服务或使用诸如 Supervisor 或 Monit 之类的进程管理器部署脚本。

Supervisor 有一个配置参数“autorestart”,如果你指定 true,它会在每次崩溃时重新启动你的脚本,这是一个稳定的生产就绪解决方案。

来自this post 的示例主管配置

[program:are_we_there_yet]
command=php /var/www/areWeThereYet.php
numprocs=1
directory=/tmp
autostart=true
autorestart=true
startsecs=5
startretries=10
redirect_stderr=false

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多