系统重启时启动实例作业

系统重启时启动实例作业

我正在使用 upstart 实例作业来启动我的一些服务。这些作业旨在为每个用户提供一个实例,即它们将用户名作为实例参数。我还将它们配置为由 upstart 重新生成。重新生成有效。这是我的配置文件的样子

start on runlevel [2345]
stop on runlevel [06]

normal exit 0

respawn
respawn limit 5 300
instance $user

chdir /home/talha/syncservice/
script
   exec python sync.py $user
end script

问题是我希望这些实例作业在系统重启时重新启动。显然我无法在重启时将所有用户名作为实例参数传入,因为我不知道上次生成了哪些实例以及生成了多少个实例。

有没有办法让 upstart 在重启后保留其实例作业的状态表?为什么我假设存在一些“状态表”?是因为我假设 upstart 会跟踪所有正在运行的实例作业。会有一个状态表跟踪在实例崩溃时要重新生成哪个实例。否则它将无法重新生成实例作业。因此,如果这些表可以在重启后保留,我的问题就解决了。

能否以某种方式实现持久性?Upstart 在哪里保存其正在运行的作业的轨迹?是仅在内存中还是在文件中?

如果做不到这一点,那就意味着

start on runlevel[2345]

对于例如工作来说没有任何意义或好处。

答案1

您可以将用户列表保存到文件(本例中为 user-sync.list)。要恢复用户脚本,您可以在启动时由 root 运行的 bash 脚本中使用 for 循环。您的 init 脚本名为 user-sync:

#!/bin/sh
# /root/restore-user-sync.sh
for user in `cat user-sync.list`; do start user-sync user=$user; done

以 root 身份将其添加到 crontab 中:

$ crontab -e

在 cron 文件中:

@reboot /root/restore-user-sync.sh

维护活跃用户列表是最复杂的部分。你可以使用 Python 脚本来做这件事,也可以将其作为 Upstart 脚本的一部分来做:

# /etc/init/user-sync.conf

start on runlevel [2345]
stop on runlevel [06]

normal exit 0

respawn
respawn limit 5 300
instance $user

chdir /home/talha/syncservice/

pre-start script
    # if $user doesn't already exist in list, add $user to list
    if ! grep $user user-sync.list; then echo $user >> user-sync.list; fi
end script

script
   exec python sync.py $user
end script

pre-stop script
    # remove line(s) from list that exactly match $user
    sed -i "/\b$user\b/d" user-sync.list
end script

您也许能够用 $USER(自动定义为当前用户名)替换 $user,否则当您调用 upstart 脚本时,您需要将用户名作为参数传递:

sudo start user-sync user=myusername

答案2

我绝对不会去惹恼新贵。你可以用另一种方式来做这件事。

Cookbook 中关于实例节的部分有一些关于如何做这样的事情的例子。我用多个 PostgreSQL 实例做了类似的事情;请参阅回答。

这里的基本思想是创建一个我称之为“小马引擎”的作业,用于启动所有实例作业。您可以让它遍历 的子目录/home,或者保留一个单独的 conf 文件,列出您希望为其运行服务的用户。为每个用户启动一个 sync.py 实例。

您说得对,start on/stop on在实例作业中是无用的。将其移至“小马引擎”作业。

不幸的是我现在无法使用 Linux,但请参阅上述答案中的示例。

相关内容