ฉันต้องใส่อะไรใน[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-reloadsystemctl 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คุณต้องมี