将Python脚本作为systemd服务运行

9
我是一位有用的助手,可以为您进行文本翻译。以下是您需要翻译的内容:

我有一个名为 myScript.py 的 Python 脚本,每隔 2 秒钟就会往文件中写入内容。但是当我将这个脚本作为 systemd 服务运行时,服务虽然正常运行,但却没有向文件中写入任何内容。

我在 /lib/systemd/system/ 目录下创建了一个 myscript.service 文件,内容如下:

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

[Service]
Type=idle
ExecStart=/usr/bin/python /home/pala/PycharmProjects/myScript.py

[Install]
WantedBy=multi-user.target

而且myScript.py是:

import time
while True:

    with open("/home/pala/Documents/file.txt", "a") as myFile:
        myFile.write("--**--")

    time.sleep(2)

你能发布 sudo systemctl status myservice 的输出吗?我尝试过了,在我的主目录下完美运行。在将服务文件添加到 /lib/systemd/system 后,你是否运行了 sudo systemctl daemon-reload 呢?另外,你是怎么知道服务正在运行的呢? - nir0s
输出如下: systemctl status myscript.service ● myscript.service - 我的脚本服务 已加载: 已加载 (/lib/systemd/system/myscript.service; 禁用; 厂商预设: 已启用) 活动的:自 Cts 2017-03-11 21:54:59 +03 起已运行 2 分钟 7 秒 主 PID:16614 (python) CGroup: /system.slice/myscript.service └─16614 /usr/bin/python /home/pala/PycharmProjects/myScript.pyMar 11 21:54:59 palaPC systemd[1]: 已启动我的脚本服务。 - pala9323
服务正常运行,如上所示没有任何问题,但我的脚本必须每2秒创建并写入file.txt文件。问题是:服务未能创建该文件。 - pala9323
在创建服务文件后,您是否运行了 sudo system systemctl start 命令? - nir0s
当服务运行时,它以什么用户身份运行?该用户是否有访问您尝试写入文件夹的权限? - Fran Fitzpatrick
显示剩余3条评论
2个回答

2
也许在myscript.service中添加一个工作目录会有帮助:
[Service]
(...)
WorkingDirectory=/home/pi/your_working_directory

最好的问候
Kilian


1

这是从您的代码创建一个服务的过程:

首先,在your_script.py上方添加以下shebang

#!/usr/bin/env python

我使用以下指令来创建自己的服务:
假设您的服务名称为"test",则创建以下文件:

test.service

[Unit]
SourcePath=/etc/init.d/test
[Service]
ExecStart=/etc/init.d/test start
ExecStop=/etc/init.d/test stop

test.sh

#!/usr/bin/env bash

# Quick start-stop-daemon example, derived from Debian /etc/init.d/ssh
set -e

# Must be a valid filename
NAME=this_is_a_test
PIDFILE=/var/run/$NAME.pid
#This is the command to be run, give the full pathname
DAEMON=/home/Your_User_Name/Your_path/your_script.py

case "$1" in
  start)
        echo -n "Starting daemon: "$NAME
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS
        echo "."
    ;;
  stop)
        echo -n "Stopping daemon: "$NAME
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
        echo "."
    ;;
  restart)
        echo -n "Restarting daemon: "$NAME
    start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile $PIDFILE
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_OPTS
    echo "."
    ;;

  *)
    echo "Usage: "$1" {start|stop|restart}"
    exit 1
esac

exit 0

然后我为上述配置创建一个安装程序:

install.sh

#!/usr/bin/env bash

echo "create a test service ..."
cp test.sh /etc/init.d/test
cp test.service /etc/systemd/system
chmod +x /etc/init.d/test
# sed -i "s/Your_User_Name/you_path/g" /etc/init.d/test
echo "created the test service"

最后,执行以下操作:

将访问权限设置为your_script.py文件:

$ chmod 755 <your_script.py>

然后使用以下命令安装服务:

$ sudo bash ./install.sh

然后使用systemctl触发服务,或者如果需要的话重新启动您的机器。

然后启动您的服务:

$ sudo service test start

你可以检查它的状态:

$ sudo service test status

[注意]:



1
这篇文章回答了“将Python脚本作为启动服务运行”的问题,但没有回答“将其作为systemd服务运行”的问题。虽然这个问题可能存在XY问题,但我认为现在转移话题还为时过早。 - MariusSiuram
6
因为以下原因投反对票:原帖中的问题与寻找Python无关,因此"env python"是多余的。使用init.d风格的脚本配合systemd比原帖更糟糕。使用cp而不是install来安装可执行文件是不好的风格。对于脚本来说,这并不像实际编译的程序那样糟糕,但使用install会更好。 - Sam Hartman
@SamHartman 那个 shebang 很重要,没有它 service test status 会出错。我回答了这个问题,如果你有答案,请发表出来。 - Benyamin Jafari
1
@Benyamin Jafari,我投票关闭了。我认为在同一个问题上回答并投票关闭是不合适的。 - Sam Hartman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接