Systemd ไม่สามารถเริ่มสคริปต์?


9

ฉันมี BASH-script ฉันต้องการเริ่มทำงาน ระบบของฉันใช้งาน systemd ดังนั้นฉันจึงสร้างไฟล์. service พร้อมกับสิ่งที่ฉันคิดว่าเป็นข้อมูลที่จำเป็น:

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

ฉันใช้ systemctl เปิดใช้งานเพื่อ 'ลงทะเบียน' มันเป็นการรีบูตเครื่อง เมื่อบูตฉันบอกว่าสคริปต์ของฉันจะถูกประหารชีวิต แต่ฉันไม่สามารถเห็นข้อความใด ๆ ที่ ECHO ควรแสดงบนหน้าจอและไม่ได้เขียนบางสิ่งลงในไฟล์ตามที่ฉันเขียนไว้ในสคริปต์ นอกจากนี้มันไม่ได้เริ่มแอปพลิเคชันที่ควรจะเริ่ม

สถานะ Systemctl บอกฉันว่าสคริปต์ทำงานและออกสำเร็จแล้ว ถึงกระนั้นสคริปต์ก็ไม่มีผล ถ้าฉันเรียกใช้สคริปต์จากเชลล์มันทำงานได้อย่างสมบูรณ์แบบ

มีใครในพวกคุณรู้บ้างไหมว่าปัญหาของฉันคืออะไร?


3
เห็นได้ชัดว่าถ้าสคริปต์ของคุณเริ่มต้นอย่างอื่นมันจำเป็นต้องมี "Type = forking" ฉันรู้สึกโง่เล็กน้อยที่ไม่ได้ยุ่งกับการตั้งค่าก่อนหน้านี้
TokyoMEWS

1
+1 สำหรับการแก้ปัญหา โปรดโพสต์โซลูชันของคุณเป็นคำตอบและยอมรับเพื่อช่วยคนอื่นที่มีปัญหาเดียวกัน
terdon

1
@TokyoMEWS: แม่นยำยิ่งขึ้นถ้าสคริปต์เริ่มต้นอย่างอื่นและออกจากขณะที่ลูกกำลังทำงานอยู่มันต้องใช้ "Type = forking"
user1686

คำตอบ:


7

นอกจากสิ่งที่ TokyoMEWS ค้นพบด้วยตัวเองแล้ว ...

เห็นได้ชัดว่าถ้าสคริปต์ของคุณเริ่มต้นอย่างอื่นจะต้องมี "Type = forking"

(ซึ่งไม่ถูกต้องอย่างสมบูรณ์ - Type=forkingมีความจำเป็นเท่านั้นหากสคริปต์ของคุณออกในขณะที่ลูกกำลังทำงานอยู่ )

... ปัญหาที่เป็นไปได้อื่น ๆ คือ:

  1. ฉันเดาว่าด้วยการ "แสดงบนหน้าจอ" คุณหมายถึงว่าสคริปต์เขียนอะไรบางอย่างเพื่อ stdout สิ่งนี้จะไม่ไปที่หน้าจอระหว่างการบู๊ต - แต่ทุกอย่างจาก stdout ของบริการจะถูกส่งไปยังวารสาร (หรือไปยัง syslog ขึ้นอยู่กับรุ่น systemd ของคุณ)

  2. หากคุณไม่จริงพยายามเขียนไปยังหน้าจอ (เช่นใช้echo Hi >/dev/tty1) แล้วก็มีโอกาสมากว่าการส่งออกของสคริปต์หายไปเมื่อagettyล้างหน้าจอก่อนที่จะแสดงข้อความแจ้งการเข้าสู่ระบบ (เพื่อหลีกเลี่ยงปัญหานี้คุณจะต้องสั่งซื้อเครื่องAfter=getty@tty1.service)

  3. ในการเขียนบางอย่างลงในไฟล์คุณต้องติดตั้งระบบไฟล์เพื่ออ่าน - เขียน สำหรับเรื่องนี้After=local-fs.target อาจมีความจำเป็นมิฉะนั้นหน่วยอาจเริ่มต้นอีกครั้งเร็วเกินไป แต่สิ่งนี้ขึ้นอยู่กับการกำหนดค่าระบบปฏิบัติการเฉพาะ


1

หากสคริปต์ของคุณกำหนดExecStopข้อเช่นกันคุณจะต้องตั้ง " RemainAfterExit = yes" เพื่อหลีกเลี่ยงExecStopถูกเรียกโดยอัตโนมัติหลังจากExecStart สิ่งนี้จะทำให้บริการของคุณอยู่ในสถานะ " แอ็คทีฟ " หลังจากดำเนินการคำสั่งExecStart

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.