systemd:为什么这个服务不活动(死)?

systemd:为什么这个服务不活动(死)?

我只是想守护这个简单的 python 脚本:

#!/usr/bin/python3
print('hello')

这是我的命令和状态:

root@gw-0317STLG0067 /lib/systemd/system # systemctl enable test.service
root@gw-0317STLG0067 /lib/systemd/system # systemctl daemon-reload
root@gw-0317STLG0067 /lib/systemd/system # systemctl start test.service
root@gw-0317STLG0067 /lib/systemd/system # systemctl status test.service
* test.service - My Script Service
   Loaded: loaded (/usr/lib/systemd/system/test.service; enabled; vendor preset:
   Active: inactive (dead) since Sun 2016-07-31 10:06:29 UTC; 4s ago
  Process: 20620 ExecStart=/root/test.py (code=exited, status=0/SUCCESS)
 Main PID: 20620 (code=exited, status=0/SUCCESS)

Jul 31 10:06:29 gw-0317STLG0067 systemd[1]: Started My Script Service.
Jul 31 10:06:29 gw-0317STLG0067 test.py[20620]: hello

这是我的服务脚本:

[Unit]
Description=My Script Service
After=multi-user.target

[Service]
Type=simple
ExecStart = /root/test.py

[Install]
WantedBy=multi-user.target

为什么它死了,当你守护打印语句时到底应该发生什么?它应该炸毁终端吗?

答案1

您的脚本通常作为服务启动,结束得非常快(因为只有一个命令,并且没有 while 循环或类似的命令来重新执行它),因此服务结束得更快,然后您可以询问其状态。尝试添加一些循环(带有超时,以免向您的日志发送垃圾邮件)以便能够看到它处于活动状态:

while True:
    print('hello')
    time.sleep(2)

一旦你看到(with journalctl -u test.service)足够多的东西,就通过systemctl杀死它。

答案2

它已死,因为脚本到达终点并终止。为什么一条print语句就会炸毁终端?守护进程通常在一个循环中运行,检查它是否到了退出时间,如果是则终止(或者如果它捕获来自内核的信号)。

答案3

您的 python 脚本打印“hello world”,然后 python 意识到它已到达脚本末尾并终止执行。

你想让 systemd 做什么?

尝试一个简单的 sh 脚本,如下所示:

#!/bin/sh touch /tmp/myfile$$.txt echo /tmp/myfile$$.txt tail -f /tmp/myfile$$.txt

<file>您可以在服务状态中获取的名称。

然后,在您的终端中,只需向其传输一些文本:echo "Hello World" >> <file>并检查服务。

重复循环和打印的服务将填满您的终端......在这里,您读取一个文件,并可以在需要时自由地向其提供一些文本。每个服务启动都会创建一个新文件,$$是 PID,接下来,作为练习,/tmp/myfile$$.txt在停止服务时删除该文件;-)

练习的关键字:trap是一种方法;-)

保持事情简单,学习,然后添加。请注意,Python 也可以对信号做出反应。我选择 sh 因为它更容易......对于初学者......

相关内容