我刚刚得到了一个 debian 8 VPS,我正在尝试将 python 脚本作为服务运行,我写了这个(一切都是通过以 root 身份登录的 ssh 完成的):
[Unit]
Description=My Script Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1
[Install]
WantedBy=multi-user.target
我把它放进去/lib/systemd/system
然后 chmoded 它:
chmod 644 /lib/systemd/system/cmcreader.service
然后我尝试使用以下命令激活它:
systemctl daemon-reload
systemctl enable cmcreader.service
然而最后一个命令返回 ( enable
) :
Failed to execute operation: Invalid argument
我做错了什么?谢谢。
答案1
从这里开始,man systemd.directives
您可以找到任何 systemd 指令的文档。在这里您可以找到ExecStart=
文档中的内容man systemd.service
。
那里的文档说:
不支持使用“<”、“<<”、“">”和“>>”的重定向、使用“|”的管道、使用“&”在后台运行程序以及 shell 语法的其他元素。
通常也不需要它们。systemd
默认情况下已经在后台运行应用程序,因此您不需要&
.它还会自动捕获输出到 STDOUT 和 STDERR 并为您记录下来,因此您也不需要将输出重定向到日志文件。
只需用于journalctl -u cmcreader
查看您的服务的日志,或journalctl
查看所有日志。
如果您不确定 systemd 文件的语法,可以使用:
systemd-analyze verify ./path/to/your.service
此外,您创建的服务文件也会进入/etc/systemd/system
。该/lib
目录用于存放由包(而不是人工)安装的服务文件。
最后,enable
不启动服务,它只是运行该[Install]
部分,将您的应用程序设置为在启动时启动。
要启动服务,请使用systemctl start your.service
.
答案2
问题是您正在尝试使用 shell 重定向运算符 - systemd 不会在 shell 中隐式运行 ExecStart 行。
它所做的就是运行您指定的程序(/usr/bin/python
在您的示例中),其他所有内容都是该程序的参数。您会收到无效参数错误,因为该> /web/cmcreader/test.log 2>&1
部分是python 的无效参数。
虽然我当然建议您简单地使用@mark-stosberg所回答的journalctl并删除重定向中的所有内容,如果您真的想要你的 python 脚本写入一个文件,你有几个选择:
- 重写你的 python 以实际写入日志文件
- 让 systemd 运行一个 bash 脚本,该脚本运行 python 脚本并重定向输出
- 让 systemd 显式运行 bash
ExecStart=bash -c "/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1"
再说一次,我并不真正推荐这些选项——尤其是最后一个。