如何在Linux中让一个脚本一直运行?

3
我正在尝试一直运行一个简单的Python脚本。我希望它可以在启动时自动启动,并能够从失败中恢复。也就是说,如果有导致脚本停止的故障,我并不关心,只想让它重新开始运行。如果整个设备重启,我也可以接受。
我刚刚测试了一个可行的脚本 使用init.d,但不确定如何从故障中恢复?是否需要通过cronjob检查pid的存在?
我还想检查完整性。也就是说,我想确保脚本没有被其他进程意外修改。我听说过检查脚本的CRC32与已知值相比较,但不确定如何对正在执行的文件进行任何类型的md5检查。
顺便说一下,这是一个非常简单的Python脚本(一个文件,约20行)。我不确定这是否真的会改变什么。

请参阅看门狗定时器。如果程序编写得“可靠”,它本身就不应崩溃,但是如果真的发生了崩溃,有自动化系统来报告和/或重新启动它。能否恢复则取决于它如何终止以及数据/操作状态及底层保证或缺乏保证。要防止修改,请剥夺访问权限。 - user2864740
Ghost博客使用supervisord来监视和重新启动可能会失败的进程。 - Paul
1
请问有没有一种方法可以在 Python 中监控另一个 Python 进程的活动,例如检测它是否仍在运行以及如何结束该进程?谢谢! - Paul
使用哪个Linux发行版?它使用SysV init吗?Upstart?Systemd? - Robᵩ
1个回答

3

Ghost博客平台安装说明 [许可证:CC-BY-3.0]中有一个部分展示了如何使用supervisord来部署一个运行博客的nodejs脚本,这样它就可以在失败和系统重启时重新启动。

Supervisor是一个进程控制系统,允许您在不使用init脚本的情况下在启动时运行Ghost。像init脚本一样,Supervisor在Linux发行版和版本之间是可移植的,包括Fedora、Debian和Ubuntu等流行的Linux发行版。

按照您的Linux发行版的要求安装Supervisor。通常,这将是:

Debian/Ubuntu: apt-get install supervisor

Fedora: yum install supervisor

大多数其他发行版:easy_install supervisor

确保Supervisor正在运行,通过运行 service supervisor start 命令。

创建Ghost安装的启动脚本。通常,这将放在 /etc/supervisor/conf.d/ghost.conf 中。例如:

[program:ghost] 
command = node /path/to/ghost/index.js 
directory = /path/to/ghost 
user = ghost 
autostart = true 
autorestart = true 
stdout_logfile = /var/log/supervisor/ghost.log 
stderr_logfile = /var/log/supervisor/ghost_err.log 
environment = NODE_ENV="production"

使用Supervisor启动Ghost: supervisorctl start ghost

停止Ghost: supervisorctl stop ghost

好的,假设你的脚本名为myscript.py,属于用户snake,并且位于/home/snake中。

那么命令应该是python /home/snake/myscript.py目录应该是你想运行此程序的位置(我们假设这是/home/snake),用户应设置适当(我们假设你想作为用户snake运行),自动化过程不变,日志文件应重命名。

环境设置任何脚本所需的ENV变量。通常情况下,除非您使用它们来控制脚本的某些方面,否则您不需要任何变量。

  1. 按上述方式安装supervisord,但不为ghost设置任何内容
  2. 相反,创建/etc/supervisor/conf.d/myscript如下:
  3. supervisorctl start myscript

/etc/supervisor/conf.d/myscript

[program:myscript] 
command = python /home/snake/myscript.py 
directory = /home/snake
user = snake
autostart = true 
autorestart = true 
stdout_logfile = /var/log/supervisor/myscript.log 
stderr_logfile = /var/log/supervisor/myscript_err.log 

应该保持运行状态,即使重启也会重新启动。

关于您的安全问题,这是有问题的。如果您假设攻击者可以读写包含脚本的文件系统,那么他们也可以更改安全哈希值。公钥签名要好一些,因为攻击者没有私钥,不知道如何更改签名。但是,攻击者可能会简单地重写测试签名的代码并绕过它或替换脚本以在验证后运行脚本来始终运行其他命令。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接