我只是想守护这个简单的 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 因为它更容易......对于初学者......