Score:1

จะรันสคริปต์เมื่อปิดเครื่อง wmctrl -l ได้อย่างไร

ธง cn

ระบบ: อูบุนตู 20

[หน่วย]
คำอธิบาย=เรียกใช้สคริปต์เมื่อเริ่มและหยุด

[บริการ]
Type=วันช็อต
RemainAfterExit=จริง  
ExecStop=/home/user/same_test.execStop=/home/user/same_test

[ติดตั้ง]
WantedBy=multi-user.target

การทดสอบเดียวกัน:

#!/bin/sh
การทดสอบเสียงก้อง >> home/user/same_test_echo.txt (ใช้งานได้)
wmctrl -l >> /home/user/same_test.txt (ไม่ทำงาน)

ผลลัพธ์คือ:

  • same_test.txt ว่างเปล่า (ไม่ทำงาน)
  • same_test_echo.txt มีการทดสอบ (ใช้งานได้)
guiverc avatar
cn flag
อูบุนตู 20? นี่คือระบบ Ubuntu Core 20 หรือไม่ เนื่องจากพวกมันมักจะหัวขาด (Ubuntu เผยแพร่โดยใช้รูปแบบ *year* เป็นผลิตภัณฑ์ที่แตกต่างจากระบบ *year.month* ทั่วไป เช่น 20 != 20.04)
Score:0
ธง in

ตัวเลือก 1 - ตรวจสอบเส้นทาง

ขั้นตอนแรกคือการดูว่าปัญหาอยู่ที่ตำแหน่งของคำสั่งหรือไม่:

$ ประเภท -a เสียงสะท้อน

เสียงสะท้อนเป็นเปลือกในตัว
เสียงสะท้อนคือ /bin/echo

$ ประเภท -a wmctrl

wmctrl คือ /usr/bin/wmctrl

เดอะ เสียงสะท้อน คำสั่งถูกสร้างขึ้นในเชลล์และยังอยู่ใน /ถังขยะ ไดเร็กทอรีซึ่งเป็นไดเร็กทอรียอดนิยมสำหรับโปรแกรม

เดอะ wmctrl คำสั่งอยู่ใน /usr/bin ไดเร็กทอรีที่อาจไม่ได้เป็นส่วนหนึ่งของ systemd ของคุณ เส้นทาง.

คล้ายกับคำถามนี้:

วิธีแก้ไขคือเพิ่มบรรทัดในบริการ systemd:

[บริการ]
สภาพแวดล้อม=PATH=/home/someUser/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

อีกทางเลือกหนึ่งคือการฮาร์ดโค้ดไดเร็กทอรีสำหรับคำสั่งเมื่อคุณเรียกใช้: /usr/bin/wmctrl.


ตัวเลือก 2 - WantedBy=multi-user.target

บันทึก: นี่เป็นตัวเลือกทั่วไปสำหรับสิ่งเหล่านั้น เริ่มต้นขึ้น และไม่ใช้กับ ปิดตัวลง เหมือนที่ OP กำลังทำอยู่

หากเส้นทางไม่มีปัญหา ขั้นตอนต่อไปคือการตรวจสอบ ต้องการโดย ตัวเลือก:

คำตอบนั้นอธิบายว่า:

โปรดทราบว่า Wants หรือ WantedBy บอกเพียงว่าระบบควรเริ่มต้นบริการหนึ่งเมื่อใดก็ตามที่บริการหรือเป้าหมายอื่นเริ่มทำงานด้วย แต่ระบบไม่ได้ระบุอะไรเลยเกี่ยวกับลำดับการเริ่มต้น/ปิดระบบ หากคุณต้องการให้บริการ B ทำงานอยู่แล้วเมื่อบริการ A เริ่มทำงาน คุณต้องเพิ่ม Before=A.service ในไฟล์ B.service เพื่อระบุการขึ้นต่อกันของคำสั่งเริ่มต้นอย่างชัดเจน

พิจารณาข้อเท็จจริงที่ว่า GUI อาจไม่ทำงานด้วยซ้ำเมื่อสคริปต์ของคุณถูกเรียกใช้ ดังนั้นจึงไม่มีหน้าต่างสำหรับ wmctrl -l เพื่อรายงาน.

หากนี่คือปัญหา หลังจาก (ระหว่างการเริ่มต้น) มากกว่า ต้องการโดย เป็นทางออกที่น่าจะเป็นไปได้


ตัวเลือก 3 - ใช้ /bin/จริง

จากความคิดเห็นในคำถาม & คำตอบนี้:

แทนที่:

RemainAfterExit=จริง

กับ:

RemainAfterExit=/bin/true

บันทึก: จริง เป็นเชลล์ในตัวและคำสั่ง:

$ ประเภท -a จริง
จริงเป็นเปลือกในตัว
จริงคือ /bin/จริง
Igor Shumakov avatar
cn flag
ฉันคิดว่าปัญหาคือบริการทำงานเมื่อปิดระบบหลังจากแอปทั้งหมดและอาจปิด gui ฉันลองแล้ว: Before=graphical.target แต่ไม่ได้ผล จะเรียกใช้บริการก่อนที่แอปและ gui ทั้งหมดจะปิดเมื่อปิดเครื่อง/รีบูตได้อย่างไร
WinEunuuchs2Unix avatar
in flag
@IgorShumakov นี่คือการอ่านเพิ่มเติมในขณะที่ฉันขุดลึกลงไปอีกเล็กน้อยเพื่อความลงตัวที่สมบูรณ์แบบ: https://unix.stackexchange.com/questions/284598/systemd-how-to-execute-script-at-shutdown-only-not- ที่รีบูต
Igor Shumakov avatar
cn flag
ขอบคุณ. บริการกำลังดำเนินการเมื่อปิดระบบ แต่ปัญหาคือ wmctl -l ยังว่างเปล่า

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา