ฉันสามารถใช้ลิงก์สัญลักษณ์เป็นบริการของ systemd ได้หรือไม่?


14

ตัวอย่างเช่นฉันมีบริการชื่อmysshd.serviceภายใต้/usr/lib/systemd/system/ไดเรกทอรี ฉันสามารถสร้างลิงค์สัญลักษณ์ได้เช่น:

ln -s /usr/lib/systemd/system/mysshd.service /usr/lib/systemd/system/fool.service

เพื่อให้การดำเนินการใด ๆ ที่ฉันทำกับคนโง่บริการจะสะท้อนให้เห็นถึงmysshd.service( systemctl enable/disable start/stop fool.servce)?

จุดประสงค์ของฉันคือการเขียนทับบริการ sshd ดั้งเดิมโดยลิงก์สัญลักษณ์ของบริการ sshd ของฉันเอง


1
ทำไมไม่เพิ่มและเปิดใช้งานบริการของคุณและปิดใช้งานบริการ sshd ดั้งเดิม
Lambert

ฉันต้องการซอฟต์แวร์ของฉันเข้ากันได้กับรุ่นก่อนหน้าซึ่งใช้ลิงค์สัญลักษณ์ /etc/init.d/ssh -> /etc/init.d/myssh
nick

ฉันยังคงไม่เข้าใจสิ่งที่คุณหมายถึง แต่ตามบรรทัดของคุณ <quote> เพื่อให้การดำเนินการใด ๆ ที่ฉันทำกับ fool.service จะสะท้อนให้เห็นถึง mysshd.service (systemctl เปิด / ปิดการใช้งานเริ่มต้น / หยุด fool.servce) </ quote > คุณอาจดูการพึ่งพา systemd (ดูwiki.archlinux.org/index.php/systemd#Handling_dependencies ) สำหรับการเริ่มต้น / เปิดใช้งานบริการของคุณหลังจาก sshd
Lambert

@nick ยินดีต้อนรับสู่ Stack Exchange! ใน Exchange Exchange เป็นประเพณีที่แสดงความรุ่งโรจน์สำหรับคำตอบโดย upvoting คุณสามารถทำได้โดยคลิกที่ลูกศรขึ้นทางด้านซ้ายของคำตอบ หากคำตอบของฉันแก้ไขปัญหาของคุณคุณอาจลองคลิกที่ช่องทำเครื่องหมายเพื่อทำเครื่องหมายว่ายอมรับ ขอบคุณ!
strugee

คำตอบ:


9

เท่าที่ฉันรู้ systemd จะไม่จัดการกับสิ่งนี้เป็นพิเศษ ตามที่ฉันเข้าใจแล้วคุณต้องการแทนที่พฤติกรรมของsshd.serviceใช่ไหม

โชคดีสำหรับคุณ systemd ถูกออกแบบมาสำหรับสิ่งนี้ เพียงแค่ใส่คำนิยามบริการของคุณในการ/etc/systemd/system/ssh.serviceดำเนินการsystemctl daemon-reloadกับไฟล์หน่วยโหลดและ systemd ssh.serviceโดยอัตโนมัติจะใช้การกำหนดค่าที่แทนของระบบ

อยากมีsystemctl enable mysshd.serviceงานทำด้วยเหรอ? ไม่มีปัญหา. ในส่วนของไฟล์หน่วยของคุณเพิ่มบรรทัดที่บอกว่า[Install] Alias=mysshd.serviceจากนั้นดำเนินการsystemctl reenable ssh.serviceเพื่อให้ systemd แก้ไขหน่วยลิงก์สัญลักษณ์และคุณเป็นสีทอง

ตอนนี้คุณยังไม่ได้ให้รายละเอียดเกี่ยวกับสิ่งที่mysshd.serviceควรทำ ถ้ามันแตกต่างจากปกติssh.serviceโดยสิ้นเชิงเยี่ยมมาก! ใช้วิธีการด้านบน อย่างไรก็ตามหากคุณต้องการเปลี่ยนสิ่งเล็ก ๆ น้อย ๆ เพียงอย่างเดียวแสดงว่าคุณกำลังใช้วิธีที่ผิด systemd ช่วยให้คุณสร้าง "ตัวอย่าง" ของไฟล์หน่วยที่จะนำไปใช้ด้านบนของไฟล์หน่วยปกติ สิ่งนี้ช่วยให้คุณสามารถเพิ่มหรือลบล้างคำสั่งแต่ละคำสั่งในขณะที่อนุญาตให้ส่วนที่เหลือของไฟล์หน่วยได้รับการปรับปรุงจากผู้จัดการแพคเกจ ในการทำสิ่งนี้เพียงสร้าง/etc/systemd/system/ssh.d/my-custom-config.conf(คุณสามารถเปลี่ยนmy-custom-config.confเป็นสิ่งที่คุณต้องการและคุณยังสามารถมีไฟล์แทนที่ได้หลายไฟล์) ssh.serviceในแฟ้มที่สถานที่สั่งสิ่งที่คุณต้องการที่จะเปลี่ยนแปลงหรือเพิ่มตามปกติ คุณสามารถเพิ่มAlias=คำสั่งเพื่อใช้systemctl start mysshd.serviceงานได้! เพียงจำไว้ว่าให้ดำเนินการsystemctl daemon-reloadหลังจากที่คุณทำ (และถ้าคุณใช้Alias=, systemctl reenable ssh.service)

เช่นกันไม่เคยเคยเปลี่ยนไฟล์หน่วย systemd /usr/lib/systemdใน ที่เคย! ระบบแฟ้ม Hierarchy มาตรฐานต้องที่/usrจะถือว่าเป็นอ่านอย่างเดียว ในทางปฏิบัติซึ่งหมายความว่าผู้จัดการบรรจุภัณฑ์จัดการ/usr(ยกเว้น/usr/local) และคุณไม่ได้สัมผัสกับสิ่งที่ผู้จัดการบรรจุภัณฑ์จัดการ - โดยเฉพาะอย่างยิ่งเพราะสิ่งที่คุณเปลี่ยนแปลงจะถูกเขียนทับในที่สุด ให้นำสิ่งของของคุณไปวางไว้ที่อื่น/etcแทน


1
ชี้แจงมันบิต: ถ้าคุณต้องการที่จะแทนที่foo.serviceวิ่งและมันจะช่วยให้สิ่งที่คุณพิมพ์ลงในsudo systemctl edit foo.service /etc/systemd/system/foo.service.d/override.conf
Rockallite

นอกจากนี้Alias=คำสั่งไม่ทำงานในไฟล์แทนที่ ดูgithub.com/systemd/systemd/issues/1090
Rockallite

@ Rockallite ไม่ทราบเกี่ยวกับsystemctl editเวลาที่ฉันเขียนคำตอบนี้ อย่าลังเลที่จะแก้ไขคำตอบของฉันเพื่อสะท้อนAlias=ข้อผิดพลาด (ใส่ "ตกลงกับผู้ตอบ" หรือบางอย่างในข้อความแก้ไข) จับดี.
strugee

5

ใช้linkกับเส้นทางแบบเต็ม:

systemctl link /home/nick/myservice.service

โปรดทราบว่าคุณไม่สามารถลิงก์ไฟล์บริการที่มีลิงค์อยู่ในตัวเองแล้ว


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