Usando o systemd para evitar que os scripts python travem

1

Eu quero evitar que vários scripts python travem no meu Raspberry Pi (Stretch OS).

Eu queria esclarecer se essa seria a maneira de implementar um arquivo systemd para evitar que scripts múltiplos python travassem. Na seção de serviço do arquivo de serviço, o formato típico é:

[Service]
ExecStart=/path/too/script
Restart=always

Mas como estou executando vários scripts python , acho que devo adicionar o python à frente do caminho, bem como a seção do serviço de empilhamento uma sobre a outra. Por favor, corrija-me se estiver errado.

Meu script atual (constantrun.service) é:

[Unit]
Description='python scripts that needs to be run constantly'

[Service]
ExecStart=python /home/pi/projects/script1.py
Restart=always
[Service]
ExecStart=python /home/pi/projects/script2.py
Restart=always
[Service]
ExecStart=python /home/pi/projects/script3.py
Restart=always

[Install]
WantedBy=multi-user.target

No entanto, quando executo, tento iniciar este arquivo de serviço com sudo systemctl start constantrun.service . Eu recebo o seguinte erro:

Failed to start constantrun.service: Unit constantrun.service is not loaded properly: Invalid argument.
See system logs and 'systemctl status constantrun.service' for details.

Eu abro o log e vejo:

● constantrun.service - 'python scripts that needs to be run constantly'
   Loaded: error (Reason: Invalid argument)
   Active: inactive (dead)

Feb 18 17:15:12 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:11] Executable path is not absolute, ignoring: python /home/pi/P
Feb 18 17:15:12 raspberrypi systemd[1]: constantrun.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
Feb 18 17:20:17 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:5] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:17 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:8] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:17 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:11] Executable path is not absolute, ignoring: python /home/pi/P
Feb 18 17:20:17 raspberrypi systemd[1]: constantrun.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
Feb 18 17:20:33 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:5] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:33 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:8] Executable path is not absolute, ignoring: python /home/pi/Pr
Feb 18 17:20:33 raspberrypi systemd[1]: [/lib/systemd/system/constantrun.service:11] Executable path is not absolute, ignoring: python /home/pi/P
Feb 18 17:20:33 raspberrypi systemd[1]: constantrun.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.

Como posso modificar o código acima para que ele funcione? Além disso, preciso adicionar um caminho à minha biblioteca python, como PYTHONPATH=/home/pi/.local/lib/python2.7/site-packages ?

Sou muito novo no ambiente linux e gostaria de receber conselhos sobre isso!

    
por Craver2000 18.02.2018 / 06:49

1 resposta

0

Suas definições de serviço são assim:

[Service]
ExecStart=python /home/pi/projects/script1.py
Restart=always

E esta é a mensagem de erro em cada um deles:

Executable path is not absolute, ignoring: python /home/pi/...

Para systemd , o "executável" nesta definição de serviço é python e claramente não é um caminho absoluto. O /home/pi/projects/script1.py é apenas um argumento para esse executável python , e importar-se com sua forma adequada é o trabalho do executável.

Todas as variáveis de ambiente específicas do Python, como PYTHONPATH , não têm nenhum significado para systemd : você deve fornecer um caminho absoluto para o executável na definição de serviço, todas as vezes.

Normalmente, o caminho absoluto para o interpretador python é /usr/bin/python , mas você pode verificar:

$ type python
python is /usr/bin/python

Assim, suas definições de serviço devem ser assim:

[Service]
ExecStart=/usr/bin/python /home/pi/projects/script1.py
Restart=always
    
por 19.02.2018 / 14:50