Ubuntu 14.04 VPS - 如何保持进程在后台运行并定期确保它仍在运行

Ubuntu 14.04 VPS - 如何保持进程在后台运行并定期确保它仍在运行

我有一台 Ubuntu 14.04 VPS,它托管着我的一个使用 Python 的 Pelican 库动态生成的网站。我可以运行“make regenerate”命令,它会自动检查源文件的更改,当它发现更改时,它会自动使用新的更改重新生成 HTML。

当我登录到 VPS 并允许这些进程在终端中运行时,这很有效,但是当我注销时它就会停止。

我想要做的是让此进程一直运行,并进行一些检查以确保它仍在运行。如果它没有运行,我希望它启动。

如何才能做到这一点?

答案1

这个问题可能更适合服务器故障因为它本质上是关于典型的系统管理员工作,例如进程管理,而不是任何 Ubuntu 特有的东西,但无论如何,答案是:

您实质上谈论的是一个守护进程——由操作系统启动和监控,并在失败时重新启动的进程。

你可以使用系统init脚本来实现这一点,但是 init 脚本可能会出现很多细微的管理问题,而且已经有更好、更简单的解决方案了。我强烈推荐主管

从该页面开始:

[...] 它与 launchd、daemontools 和 runit 等程序有着相同的目标。与其中一些程序不同,它并非旨在作为“进程 ID 1”来替代 init。相反,它旨在用于控制与项目或客户相关的进程,并像任何其他程序一样在启动时启动。

在 Ubuntu 上,你可以使用 安装 Supervisord sudo apt-get install supervisor。然后在 Supervisor 的配置目录中创建一个新的配置文件(在 Ubuntu 上,这是/etc/supervisor/conf.d),并将其命名为pelican_watcher.conf.conf扩展名很重要)

[program:pelican_watcher]
directory=/directory/of/command
command=watch_regenerate.py
user=timbram
autostart=true
autorestart=true

然后,您可以创建一个程序,仅监视更改,并make regenerate在文件更改时运行(确保您为上面的 、 和 添加了您自己的真实usercommanddirectory

这个python脚本使用该watchdog包来通知你目录的变化,并在文件改变时运行一些命令。

#!/usr/bin/env python2
import sys
import subprocess
import time

from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler

PELICAN_DIR = "/path/to/your/pelican/site"


class PelicanWatcher(FileSystemEventHandler):
    def on_modified(self, event):
        try:
            subprocess.check_call(['make', 'regenerate'])
        except subprocess.CalledProcessError:
            # You may want better logging here, such as sending mail or similar
            sys.stderr.write("an error occurred!")


if __name__ == '__main__':
    observer = Observer()
    event_handler = PelicanWatcher()
    observer.schedule(event_handler, PELICAN_DIR, recursive=True)

    observer.start()
    # Now sleep forever while watchdog does it's business
    while True:
        time.sleep(60)

要安装看门狗,sudo apt-get install python-watchdog请确保您编辑了我输入的虚假路径(PELICAN_DIR

然后,把这个 python 脚本放到你在主管配置文件 ( watch_regenerate.py) 中指定的任何位置,使其可执行,然后sudo supervisorctl reread && sudo supervisorctl update。从那里,如果脚本意外终止,supervisord 将重新启动该脚本,并在启动时启动该进程。

Supervisor 还有一个交互式命令,你可以在其中检查正在运行的进程:sudo supervisorctl不带任何参数

阅读文档:http://超级

相关内容