Systemd:在启动时运行Python脚本(virtualenv)


11

我有一个Python脚本,通常使用以下命令运行它:

(environment) python run.py

我想在开始时运行此脚本。(我正在使用ubuntu)这是我的服务:

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

[Service]
Type=idle

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

[Install]
WantedBy=multi-user.target

顺便说一句,我无法运行此脚本,但是我可以运行不在环境中的任何脚本。如何在启动(virtualenv)时运行python脚本?

sudo systemctl status user_sent
● user_sent.service - Mail Service
Loaded: loaded (/lib/systemd/system/user_sent.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since xxxxx 16:30:20 MSK; 3s ago
Process: 3713 ExecStart=/usr/bin/python run.py (code=exited,   status=200/CHDIR)
Main PID: 3713 (code=exited, status=200/CHDIR)

1
什么说日志和状态?
费德里科·塞拉

我已经编辑了我的问题。非常感谢@FedericoSierra
茉莉花

1
该脚本运行过程中出现外VENV,/usr/bin/python run.pystackoverflow.com/questions/37211115/...unix.stackexchange.com/questions/278188/...
费德里科·塞拉

我确实尝试过。我必须运行“ python run.py”而不是“ python /user_sent/run.py”
Jasmine

1
python路径必须指向虚拟环境中的版本,例如/path/to/your/virtualenv/bin/python
Federico Sierra

Answers:


14

您的单位文件正确。如果要在venv下运行任何python文件,只需引用venv目录中的python二进制文件即可。/home/user/anaconda3/bin/python

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

[Service]
Type=idle

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

[Install]
WantedBy=multi-user.target

突出的原因是您的设备出现故障的原因:code=exited, status=200/CHDIR。这很可能表明脚本中存在问题。

如果要调试,请执行以下操作:

  1. ExecStart=完全按照root用户的身份运行添加到命令中的命令,以查看问题是否是由脚本引起的。
  2. 如果运行没有错误,请使用查看日志journalctl -u <unit_name>。这应该为您提供有关单元问题的更多信息。

圣经后

以下两个[Service]选项均起作用:

ExecStart=/home/user/anaconda3/bin/python /home/user/space/run.py

要么

WorkingDirectory=/home/user/space
ExecStart=/home/user/anaconda3/bin/python run.py

唯一的区别是脚本中的相对调用从不同的目录运行。因此,如果您的脚本包含一行open("my_file", "w"),则在第一个示例中它将创建一个文件/my_file,第二个示例将创建一个文件/home/user/space/my_file

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.