Systemd: Jalankan Skrip Python Saat Startup (virtualenv)

11

Saya memiliki skrip python yang biasanya saya jalankan dengan perintah ini:

(environment) python run.py

Saya ingin menjalankan skrip ini di awal. (Saya menggunakan ubuntu) Ini layanan saya:

[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

BTW, saya tidak bisa menjalankan skrip ini, tetapi saya bisa menjalankan skrip apa pun yang tidak di dalam lingkungan. Bagaimana saya bisa menjalankan skrip python saat startup (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)
Melati
sumber
1
Bagaimana dengan log dan status?
Federico Sierra
Saya telah mengedit pertanyaan saya. Terima kasih banyak @FedericoSierra
Jasmine
1
Script dijalankan di luar venv,, /usr/bin/python run.pylihat stackoverflow.com/questions/37211115/… dan unix.stackexchange.com/questions/278188/…
Federico Sierra
Saya sudah mencobanya. Saya harus menjalankan "python run.py" bukan "python /user_sent/run.py"
Jasmine
1
Jalur python harus mengarah ke versi di dalam lingkungan virtual, Eg/path/to/your/virtualenv/bin/python
Federico Sierra

Jawaban:

14

File unit Anda sudah benar. Jika Anda ingin menjalankan file python di bawah venv, Anda hanya perlu referensi biner python di direktori venv seperti yang Anda lakukan dengan/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

Apa yang menonjol adalah alasan unit Anda gagal: code=exited, status=200/CHDIR. Ini kemungkinan besar menunjukkan masalah dalam skrip Anda.

Jika Anda ingin men-debug itu, Anda akan melakukan hal berikut:

  1. Jalankan perintah yang Anda tambahkan ke ExecStart=persis seperti itu di bawah root untuk melihat, jika masalah disebabkan oleh skrip Anda.
  2. Jika itu berjalan tanpa kesalahan, lihat jurnal dengan journalctl -u <unit_name>. Itu akan memberi Anda lebih banyak informasi tentang masalah dengan unit Anda.

Skrip Posting

Kedua [Service]opsi berikut berfungsi:

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

atau

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

Satu-satunya perbedaan adalah bahwa panggilan relatif dalam skrip Anda dijalankan dari direktori yang berbeda. Jadi, jika skrip Anda berisi baris open("my_file", "w"), pada contoh pertama akan membuat file /my_filedan yang kedua file /home/user/space/my_file.

Daniel
sumber