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

我有一个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 

顺便说一句,我不能运行这个脚本,但我可以运行任何脚本不在内部环境。 如何在启动时运行python脚本(virtualenv)?

 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) 

你的单元文件是正确的。 如果你想在venv下运行任何python文件,只需要像在/home/user/anaconda3/bin/python那样引用venv目录中的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 。 这很可能表明您的脚本中存在一个问题。

如果你想debugging,你会做到以下几点:

  1. 运行你添加到ExecStart=的命令ExecStart=就像在根目录下查看,如果问题是由你的脚本引起的。
  2. 如果运行没有错误,请使用journalctl -u <unit_name>查看日记。 这应该会给你更多关于你的单位问题的信息。

发布Scriptum

以下两个[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") ,在第一个例子中它将创build一个文件/my_file ,第二个文件/home/user/space/my_file