Systemd: เรียกใช้สคริปต์ Python เมื่อเริ่มต้น (virtualenv)


11

ฉันมีสคริปต์ไพ ธ อนซึ่งปกติฉันจะรันด้วยคำสั่งนี้:

(environment) python run.py

ฉันต้องการเรียกใช้สคริปต์นี้เมื่อเริ่มต้น (ฉันใช้อูบุนตู) นี่คือบริการของฉัน:

[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 ฉันไม่สามารถเรียกใช้สคริปต์นี้ แต่ฉันสามารถเรียกใช้สคริปต์ที่ไม่ได้อยู่ในสภาพแวดล้อม ฉันจะเรียกใช้สคริปต์ 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)

1
บันทึกและสถานะพูดว่าอย่างไร?
Federico Sierra

ฉันได้แก้ไขคำถามของฉัน ขอบคุณมาก @FedericoSierra
จัสมิน

1
สคริปต์ดังกล่าวทำงานนอก venv /usr/bin/python run.pyโปรดดูstackoverflow.com/questions/37211115/…และunix.stackexchange.com/questions/278188/…
Federico Sierra

ฉันลองพวกเขา ฉันต้องเรียกใช้ "python run.py" ไม่ใช่ "python /user_sent/run.py"
Jasmine

1
เส้นทางหลามจะต้องชี้ไปที่เวอร์ชันภายในสภาพแวดล้อมเสมือนจริงเช่น/path/to/your/virtualenv/bin/python
Federico Sierra

คำตอบ:


14

ไฟล์หน่วยของคุณถูกต้อง หากคุณต้องการเรียกใช้ไฟล์ไพ ธ อนใด ๆ ภายใต้venvคุณเพียงแค่ต้องการอ้างอิงไบนารี่ไพ ธ อนในไดเรกทอรีvenvเช่นเดียวกับที่คุณทำ/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=อย่างนั้นภายใต้รูทเพื่อดูว่าปัญหาเกิดจากสคริปต์ของคุณหรือไม่
  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")ในตัวอย่างแรกมันจะสร้างไฟล์และแฟ้มที่สอง/my_file/home/user/space/my_file

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.