systemd ไม่สนใจ ExecStop ในไฟล์ยูนิตรันมันเป็นส่วนหนึ่งของ ExecStart


2

ฉันพยายามที่จะมีหลายภาพ VirtualBox เริ่มโดยอัตโนมัติในการบูตและจะปิดอย่างถูกต้องในการปิดโฮสต์ก่อนที่จะปิดตัวลง ฉันมีสคริปต์ทุบตี/usr/local/bin/vmctl.shที่จัดการเริ่มต้นและหยุดภาพผู้เยี่ยมชมโดยใช้การโทรไปยัง VBoxManage การโทรเริ่มต้นนั้นง่ายมาก - เพียงแค่วิ่งผ่านรายการรูปภาพและการโทรVBoxManage startvm --type headless "<imgname>"จากนั้นออกจาก 0 การหยุดการโทรจะวนไปตามรายการและการโทรVBoxManage controlvm "<imgname>" acpipowerbuttonจากนั้นจะวนซ้ำจนกว่าจะVBoxManage list runningvmsส่งกลับรายการว่างเปล่าหรือ 60 วินาทีผ่านไปก่อนที่จะออก บรรทัดคำสั่งทำงานได้อย่างสมบูรณ์

ฉันได้ตั้งค่าไฟล์หน่วยใน/lib/systemd/system/vmctl.service:

[Unit]
Description=VirtualBox Control
After=virtualbox.service

[Service]
ExecStart=/usr/local/bin/vmctl.sh start
ExecStop=/usr/local/bin/vmctl.sh stop

[Install]
WantedBy=multi-user.target

เมื่อฉันวิ่งsystemctl start vmctl.serviceมันจะเรียกทั้งสายเริ่มและหยุด เมื่อฉันเรียกว่าsystemctl stop vmctl.serviceมีรายการใน syslog ที่ระบุStopped VirtualBox Controlแต่ไม่ได้ทำอะไร

ฉันเป็นเณรทั้งหมดไป systemd ฉันเพิ่งอัปเกรดกล่อง Ubuntu นี้เป็น 16.04 ฉันค่อนข้างแน่ใจว่ามีคำอธิบายง่ายๆสำหรับพฤติกรรมนี้ที่ฉันไม่เห็น

ขอบคุณ!


อัปเดตตามคำแนะนำของ Mark:

ฉันยืนยันไวยากรณ์โดยใช้systemd-analyze verify /etc/systemd/system/vmctl.service(หลังจากย้ายไฟล์ที่นั่น - ขอบคุณสำหรับเคล็ดลับ) จากนั้นฉันก็เปลี่ยน ExecStart และ ExecStop ตามที่คุณแนะนำวิ่งsystemctl daemon-reloadและยังคงเห็นพฤติกรรมเดียวกัน บันทึกแสดงทั้งการดำเนินการเมื่อมีการโทรsystemctl start vmctlแต่ไม่มีเมื่อทำงานsystemctl stop vmctl:

# journalctl -u vmctl | tail
.
.
.
Apr 06 19:28:18 macmi10-builder systemd[1]: Started VirtualBox Control.
Apr 06 19:28:18 macmi10-builder echo[13901]: I started
Apr 06 19:28:18 macmi10-builder echo[13904]: I stopped
Apr 06 19:28:33 macmi10-builder systemd[1]: Stopped VirtualBox Control.

จริง ๆ แล้วฉันมีปัญหาเดียวกันยกเว้นว่าฉันมีชื่อสคริปต์ที่แตกต่างกันฉันตั้งRemainAfterExit = ใช่และใช้งานได้
ครีบ

คุณเคยไปที่ด้านล่างของเรื่องนี้หรือไม่?
Jem Tucker

คำตอบ:


4

ดังที่คนอื่น ๆ ได้กล่าวถึงปัญหาคือvmctl.shออกจากทันที ตรงกันข้ามกับคำตอบของ @ Christophe การตีจะไม่ได้ผลมากที่สุดเท่าที่vmctl.shจะเป็นไปได้ สิ่งที่คุณต้องเป็นบริการที่มีoneshot RemainAfterExit=trueหากคุณเพียงแค่เปลี่ยนเป็นoneshotคุณจะได้รับพฤติกรรมเดียวกัน RemainAfterExitส่วนหนึ่งบอกว่าแม้หลังจากที่ExecStartออกให้บริการจะยังคงได้รับการพิจารณาใช้จึงไม่ควรเรียกใช้ExecStop(s)


ทุกคนช่วยชีวิต, oneshot ทำงานได้สมบูรณ์แบบสำหรับบริการ vncserver: D ขอบคุณ
erm3nda

4

systemdไวยากรณ์ของคุณถูกต้อง ปัญหาของคุณอยู่ที่อื่น

ก่อนอื่นคุณสามารถยืนยันได้ว่าไวยากรณ์นั้นถูกต้องด้วย:

systemd-analyze verify /path/to/your/vmctl.service

ประการที่สองลองแทนที่บรรทัดเหล่านี้:

ExecStart=/bin/echo "I started"
ExecStop=/bin/echo "I stopped"

หลังจากทำงานsystemctl start vmctlหรือsystemctl stop vmctlใช้journalctl -u vmctlเพื่อตรวจสอบบันทึก ฉันคาดว่าคุณจะยืนยันการsystemdรันคำสั่งที่ถูกต้อง

นอกจากนี้ยัง/lib/systemd/systemมีไว้สำหรับแพคเกจเพื่อจัดการไฟล์ systemd ไฟล์ที่มนุษย์แก้ไขและจัดการด้วยตนเองมีจุดประสงค์เพื่อเข้าใช้/etc/systemd/system


หลังจากแทนที่คำสั่งเหล่านั้นในเซอร์วิสแบบง่ายหรือฟอร์กกิ้งลักษณะการทำงานเดียวกันจะสะท้อนให้เห็น สำหรับง่ายExecStart's ExecStopสะท้อนออกดังนั้นจึงเรียกร้องให้ สำหรับฟอร์กไม่มีกระบวนการทำงานของเด็กจากExecStart's ExecStopก้องและเป็นเช่นนั้นเรียก
Duncan X Simpson

0

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

Type = forkingถูกใช้เมื่อกระบวนการที่ระบุโดย ExecStart ถูกคาดหวังว่าจะออกหลังจากการเริ่มต้นเสร็จสมบูรณ์ในขณะที่กระบวนการลูกจะดำเนินการต่อเพื่อให้ทำงานในพื้นหลัง นี่คือพฤติกรรมของ UNIX daemons ดั้งเดิมและตัวเลือกที่แนะนำในกรณีของคุณ กระบวนการที่ระบุโดย ExecStop จะทำงานในกรณีที่บริการขัดข้องหรือตามคำสั่ง“ systemctl stop vmctl”

ดังนั้นไฟล์หน่วยของคุณควรเป็น:

[Unit]
Description=VirtualBox Control
After=virtualbox.service

[Service]
Type=forking
ExecStart=/usr/local/bin/vmctl.sh start
ExecStop=/usr/local/bin/vmctl.sh stop

[Install]
WantedBy=multi-user.target

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