ฉันต้องใส่อะไรใน[install]
ส่วนเพื่อให้ systemd ทำงาน/home/me/so.pl
ก่อนปิดและก่อนที่/proc/self/net/dev
จะถูกทำลาย?
[Unit]
Description=Log Traffic
[Service]
ExecStart=/home/me/so.pl
[Install]
?
ฉันต้องใส่อะไรใน[install]
ส่วนเพื่อให้ systemd ทำงาน/home/me/so.pl
ก่อนปิดและก่อนที่/proc/self/net/dev
จะถูกทำลาย?
[Unit]
Description=Log Traffic
[Service]
ExecStart=/home/me/so.pl
[Install]
?
คำตอบ:
วิธีแก้ปัญหาที่แนะนำคือการเรียกใช้หน่วยบริการเป็นบริการปกติ - ดูที่[Install]
ส่วน ดังนั้นทุกอย่างจะต้องมีการคิดย้อนกลับการพึ่งพาเช่นกัน เพราะคำสั่งปิดเป็นลำดับเริ่มต้นย้อนกลับ ExecStop=
นั่นเป็นเหตุผลที่สคริปต์จะต้องมีการวางไว้ใน
วิธีแก้ปัญหาต่อไปนี้ใช้ได้กับฉัน:
[Unit]
Description=...
[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>
[Install]
WantedBy=multi-user.target
RemainAfterExit=true
เป็นสิ่งจำเป็นเมื่อคุณไม่มีการExecStart
กระทำ
หลังจากที่สร้างไฟล์ให้แน่ใจว่าการและsystemctl daemon-reload
systemctl enable yourservice --now
ฉันเพิ่งได้รับจาก systemd IRC เครดิตจะไป mezcalero
RemainAfterExit=true
เป็นสิ่งจำเป็นเมื่อไม่มีExecStart
อยู่เพราะsystemd
จะไม่พยายามเรียกใช้ExecStop
หากคิดว่าบริการไม่ทำงาน RemainAfterExit=true
ทำให้เกิดsystemd
การเชื่อว่าบริการที่ทำงานจึงก่อให้เกิดการทำงานExecStop
ที่ปิด
เท่าที่ฉันเห็นนี่เป็นสิ่งที่ฉันต้องการ (แต่ฉันไม่รู้ว่าทำไม)
[Unit]
Description=Log Traffic
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
[Service]
ExecStart=/usr/local/bin/perl /home/me/log_traffic.pl --stop
Type=oneshot
kexec.target
ในบิตก่อนหน้า
WantedBy=shutdown.target reboot.target halt.target
ใน[Unit]
ส่วน Before=
& After=
ไม่เปลี่ยนการพึ่งพา
ในการรันบริการทันทีก่อนที่จะเริ่มบริการ reboot / shutdown / halt / kexec ใด ๆ (เช่นในช่วงเวลาสุดท้ายก่อนที่ระบบไฟล์รูทจะกลายเป็นแบบอ่านอย่างเดียว) อีกครั้งใช้บริการ config นี้:
[Unit]
Description=Save system clock on shutdown
DefaultDependencies=no
After=final.target
[Service]
Type=oneshot
ExecStart=/usr/lib/systemd/scripts/fake-hwclock.sh save
[Install]
WantedBy=final.target
เปิดใช้งานด้วย:
systemctl enable my_service.service
หากต้องการรันสคริปต์ก่อนที่จะรีบูต / ปิดระบบ / halt / kexec จริง (เมื่อคุณไม่สามารถเขียนไปยังระบบไฟล์รูทได้เนื่องจากมีการติดตั้งซ้ำแบบอ่านอย่างเดียว) ให้เพิ่มสคริปต์นี้ลงใน/usr/lib/systemd/system-shutdown
ไดเร็กทอรี
ทันทีก่อนที่จะเรียกใช้ระบบจริงหยุด / poweroff / reboot / kexec systemd-shutdown จะเรียกใช้งาน executables ทั้งหมดใน / usr / lib / systemd / system-shutdown / และส่งหนึ่งอาร์กิวเมนต์ไปยังพวกเขา: ทั้ง "หยุด", "poweroff", "poweroff" "หรือ" kexec "ขึ้นอยู่กับการกระทำที่เลือก ไฟล์เรียกทำงานทั้งหมดในไดเร็กทอรีนี้ถูกเรียกใช้งานแบบขนานและการดำเนินการของแอ็คชันจะไม่ต่อเนื่องก่อนที่ไฟล์เรียกทำงานทั้งหมดจะเสร็จสิ้น
ดูเพิ่มเติมที่:
https://www.freedesktop.org/software/systemd/man/bootup.html
https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html
final.target
ฉันต้องการที่จะดำเนินการบางสิ่งบางอย่างที่ใกล้ที่สุดหลังจากที่เริ่มต้นการรีบูตวิธีก่อน $ sudo reboot
ดีฉันชอบที่มันเป็นสิ่งแรกที่ถูกดำเนินการหลังจากที่ผู้ใช้ทำ
ฉันไม่แน่ใจทั้งหมด แต่ฉันไม่คิดว่าคุณต้องการส่วนการติดตั้งแม้ว่าฉันจะเพิ่มมันอย่างชัดเจน ฉันยังไม่ได้ทดสอบ แต่ฉันคิดว่าควรช่วยให้คุณเริ่มต้น:
[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no
[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=shutdown.target
ExecStart=/bin/true
คุณต้องมี