ไม่สามารถเริ่มบริการได้


16

ฉันได้สร้างบริการ systemd:

[Unit]
Description=My service

[Service]
Type=forking
ExecStart=/bin/sh $HOME/theFolder/run.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=mine.service

ฉันวางไว้ในโฟลเดอร์ / etc / systemd / system และตั้งชื่อมันว่า mine.service

ถ้าฉันใช้sudo service mine startมันให้ฉัน:

ไม่สามารถเริ่มต้น mine.service.Unit mine.service ไม่พบ

--- ปรับปรุง -----

ฉันเรียกใช้ก่อนsudo systemctl daemon-reloadและตอนนี้ไม่ได้ให้ข้อความใด ๆ แก่ฉัน แต่บริการยังไม่เริ่มทำงาน


10
คุณรันsystemctl daemon-reloadหลังจากสร้างไฟล์หน่วยของคุณหรือไม่
Wieland

@ Wieland: อืม .. ตอนนี้มันไม่แสดงข้อความใด ๆ ให้ฉันเลย แต่มันยังไม่เริ่มเลย
จอร์จ

@don_crissti: สถานะแจ้งว่ามีการใช้งานอยู่ แต่สคริปต์ (ใน ExecStart) ไม่ได้ถูกดำเนินการ
George

มันจะรู้ $ HOME ที่เหมาะสมได้อย่างไร? สิ่งที่คุณคาดหวังว่าจะเป็นสำหรับการให้บริการระบบ?
Serge

@Serge: อืม .. ดังนั้นฉันจะใช้ $ HOME ได้อย่างไร
George

คำตอบ:


14

$HOMEชี้ไปที่โฮมไดเร็กตอรี่ของผู้ใช้ที่กำลังเรียกใช้สคริปต์ บริการ Systemd /root/theFolder/run.shจะเริ่มต้นกับรากดังนั้นจึงมีแนวโน้มที่จะพยายามที่จะ ใช้พา ธ สัมบูรณ์ในไฟล์บริการ

คุณยังมีforkingชุดตัวเลือก สิ่งนี้จำเป็นสำหรับโปรแกรมที่พื้นหลังของตัวเองสคริปต์ของคุณทำสิ่งนี้หรือไม่? ส่วนใหญ่ทำไม่ได้และหากคุณไม่ได้คุณควรลบตัวเลือกนี้มิฉะนั้น systemd จะรอให้สคริปต์ของคุณเสร็จสิ้นเพื่ออ้างสิทธิ์เมื่อเริ่มต้น

นอกจากนี้ยังมีไฟล์บริการระบบที่ชี้ไปที่สคริปต์ในไดเรกทอรีหลักของคุณและอาจเป็นปัญหาด้านความปลอดภัย เนื่องจากมันถูกเรียกใช้ในฐานะรูทใครก็ตามที่สามารถปรับเปลี่ยนมันอาจจะสามารถเข้าถึงรูทคอมพิวเตอร์ของคุณได้ เป็นการดีกว่าที่จะคัดลอกสคริปต์ไปยัง/usr/local/binและตรวจสอบให้แน่ใจว่าเป็นเจ้าของและสามารถเขียนได้โดย root เพื่อหยุดสิ่งนี้ เป็นความคิดที่ดีที่จะเรียกใช้สคริปต์ในฐานะผู้ใช้ที่ไม่มีสิทธิใช้งานUser=และใช้Group=ตัวเลือกในไฟล์บริการ

หากคุณต้องการเรียกใช้ในฐานะผู้ใช้ของคุณจะเป็นการดีกว่าที่จะวางไฟล์บริการใน~/.config/systemd/user/และเริ่ม / เปิดใช้งานด้วยsystemctl --user enable yourservice && systemctl --user start yourservice(หมายเหตุให้เรียกใช้ในฐานะผู้ใช้ของคุณไม่ใช่รูท) ดูสิ่งนี้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับไฟล์บริการผู้ใช้


: ฉันใส่สคริปต์ลงใน / usr / local / bin และบริการลงใน /.config/systemd/user ถ้าฉันพยายามเปิดใช้งานบริการก็จะแสดง "อาร์กิวเมนต์ที่มากเกินไป" ถ้าฉันพยายามใช้ systemctl มันจะแสดงว่า 'ล้มเหลว .. unit .. 'บางอย่างเช่นนี้
จอร์จ

คุณสามารถให้คำสั่งเต็มรูปแบบที่คุณพยายามและบันทึกรายละเอียด มันยากที่จะแก้จุดบกพร่องด้วยชิ้นส่วน
Michael Daffin

: มีวิธีแก้ปัญหาให้ใช้เส้นทาง $ HOME หรือไม่เพราะถ้าฉันใส่สคริปต์ใน / usr / local / bin จะใช้เส้นทางสัมพัทธ์กับ $ HOME ฉันเห็นสิ่งนี้และฉันพยายามใส่HOME=$HOMEไฟล์สภาพแวดล้อมตัวแรก แต่บริการไม่สามารถเริ่มได้ไม่มีข้อผิดพลาด
จอร์จ

1
บน Ubuntu ฉันต้องใช้ systemctl สำหรับ systemdl นี้ไม่ใช้ systemd ฉันได้รับข้อผิดพลาด "ข้อโต้แย้งส่วนเกิน"
Alexander Mills

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