尝试使用 systemd 将 python 脚本作为服务运行

尝试使用 systemd 将 python 脚本作为服务运行

我刚刚得到了一个 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 显式运行 bashExecStart=bash -c "/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1"

再说一次,我并不真正推荐这些选项——尤其是最后一个。

相关内容