ล้มเหลวในขั้นตอน EXEC วางไข่: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว


0

เมื่อรับบริการ one-shot ต่อไปนี้เปิดใช้งานเมื่อบูต

[Unit]

Description = My Server Daemon
Documentation = https://etcetc.org

Wants = network-online.target getty.target NetworkManager-wait-online.service isc-dhcp-server.service xinetd.service smbd.service
After = network-online.target getty.target NetworkManager-wait-online.service isc-dhcp-server.service xinetd.service smbd.service

[Service]

Type = oneshot

RemainAfterExit = yes

User = foouser

PIDFile = /run/myd.pid

WorkingDirectory = /home/foouser/my-server/bin

ExecStart = /home/foouser/my-server/bin/myd
ExecStop = /home/foouser/my-server/bin/abort.sh

TimeoutStopSec = 5

[Install]

WantedBy = multi-user.target

มันล้มเหลวในการเริ่มต้นจริง ๆ กรอง /var/log/syslog

systemd [1]: myd.service: ล้มเหลวในขั้นตอน CHDIR วางไข่ / home / foouser / my-server / bin / my: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

ในขณะที่ journalctl --unit=myd.service ตกลง

systemd [1]: myd.service: ออกจากกระบวนการหลักแล้วโค้ด = ออกแล้วสถานะ = 200 / CHDIR

ดังนั้นตั้งแต่ /home/foouser/my-server/bin/myd เป็นลิงค์อ่อนของฉันไป /home/foouser/my-server/xspyctra/xspyctrad.py, ผม

  1. การเปลี่ยนแปลง ExecStart = /home/foouser/my-server/xspyctra/xspyctrad.py
  2. แสดงความคิดเห็น WorkingDirectory ที่ฉันไม่สนใจจริง ๆ เพราะสคริปต์หลามจะทำ os.chdir('/home/foouser/my-server/bin') ด้วยตัวเอง

บริการโหลดใหม่รีบูตระบบ ฯลฯ แต่ตอนนี้ฉันตกตะลึงจากข้อผิดพลาด

systemd [1653]: myd.service: ล้มเหลวในขั้นตอน EXEC วางไข่ /home/foouser/my-server/xspyctra/xspyctrad.py: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว

systemd [1]: myd.service: ออกจากกระบวนการหลักแล้วโค้ด = ออกจากสถานะ = 203 / EXEC

ฉันสามารถให้สิทธิ์เพื่อให้แน่ใจว่าไฟล์นั้นมีอยู่

$ ls -l /home/foouser/my-server/xspyctra/xspyctrad.py
-rwxrw-r-- 1 foouser foouser 5532 May 10 16:13 /home/foouser/my-server/xspyctra/xspyctrad.py

เป็นการวินิจฉัยครั้งสุดท้าย service myd status

● myd.service - My Server Daemon
  Loaded: loaded (/etc/systemd/system/myd.service; enabled; vendor preset: enabled)
  Active: failed (Result: exit-code) since Fri 2018-05-11 10:58:21 CEST; 16min ago
  Docs: https://etcetc.org
  Main PID: 1627 (code=exited, status=203/EXEC)

แก้ไข 1

อย่างไรก็ตามสิ่งนี้อาจเกิดขึ้นในช่วงเวลาบูต ที่จริงแล้ว,

sudo service myd stop
sudo service myd start

ดูเหมือนว่าจะทำงานเพราะ service myd status

● myd.service - My Server Daemon
     Loaded: loaded (/etc/systemd/system/myd.service; enabled; vendor preset: enabled)
     Active: activating (start) since Fri 2018-05-11 11:22:52 CEST; 1min 16s ago
       Docs: https://etcetc.org
   Main PID: 2106 (python2)
      Tasks: 24
     Memory: 545.1M
        CPU: 10.913s
     CGroup: /system.slice/myd.service
       ├─2106 python2 /home/foouser/my-server/bin/myd
       ├─2122 ./<my-child-process-a>
       ├─2127 ./<my-child-process-b>
       └─2133 ./<my-child-process-c>

อย่างที่คาดไว้. นอกจากนี้ให้สังเกตว่า xspyctrad.pyสคริปต์ที่แท้จริงจะวางไข่ twisted.reactorดังนั้นจะไม่กลับมาและอยู่ในเบื้องหน้า

ดังนั้นความผิดพลาดของฉันอยู่ที่ไหน


1
คุณแน่ใจไหม /home/ ติดตั้งเมื่อเครื่องทำงานเมื่อเริ่มต้นหรือไม่ เป็นของคุณ /home/foouser/ เข้ารหัสอาจจะ? นอกจากนี้ยังมี ProtectHome= ตัวเลือก แต่ฉัน เดา ถ้ามันเป็นปัญหาแล้วตัวอย่างสุดท้ายจะล้มเหลว
Kamil Maciorowski

ใช่, /home/foouser/ ถูกเข้ารหัส ดังนั้นจึงควรติดตั้งทุกอย่างภายใน /usr/bin/...
Patrizio Bertoni

คำตอบ:


1

นอกเหนือจากการย้ายโปรแกรมปฏิบัติการไปยังตำแหน่งที่เข้าถึงได้เร็ว (ซึ่งเป็นสิ่งที่ดีที่ต้องทำ) คุณสามารถระบุการขึ้นต่อเชื่อมเพื่อบอก systemd ให้ชะลอการเริ่มต้นหน่วยของคุณจนกว่าจะมีการติดตั้ง

คุณสามารถใช้ RequiresMountsFor=:

[Unit]
RequiresMountsFor=/home/foouser/my-server/bin

หรือระบุ Requires= / After= บนที่สอดคล้องกัน .mount หน่วย ถ้าคุณรู้อย่างแน่นอน อะไร จะต้องมีการติดตั้ง:

[Unit]
Requires=home-foouser.mount
After=home-foouser.mount

1

เมื่อ Kamil ชี้ไปที่ /home/foouser/ ไม่มีอยู่ในขณะที่เริ่มให้บริการ การย้ายไปยังตำแหน่งที่มีอยู่ปิดปัญหา

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