ฉันจะเรียกใช้บริการ systemd เมื่อเริ่มต้นก่อนที่บริการ systemd อื่นจะเริ่มทำงานได้อย่างไร


9

ฉันใช้ Ubuntu 16.04 กับแล็ปท็อป HP เครื่องเก่า

ฉันได้ติดตั้งซอฟต์แวร์บางอย่างเพื่อสร้างเซิร์ฟเวอร์เพล็กซ์ขนาดเล็ก ฉันได้ติดตั้ง sonarr, radarr, deluge, jackett, etc ฯลฯ และพวกเขาทั้งหมดจะเปิดตัวโดยอัตโนมัติเมื่อเริ่มต้น!

สองสามวันที่ผ่านมาฉันตัดสินใจที่จะติดตั้ง rclone ด้วยและฉันได้สร้าง (ขอบคุณโครงการ GitHub) สองสามโฟลเดอร์ที่ต้องติดตั้งในแต่ละการเริ่มต้นด้วยการเปิดตัวสคริปต์ (ฉันเปิดมันผ่านการเขียน terminal sudo ~/bin/check.mount) Sonarr และ Radarr ได้รับการตั้งค่าให้ดาวน์โหลดสิ่งต่าง ๆ ผ่านทาง deluge ไปยังโฟลเดอร์ temp แล้วส่งออกไปยังหนึ่งในสองโฟลเดอร์ที่ติดตั้ง

ปัญหาคือตามเวลาที่ฉันเปิดตัวสคริปต์ Sonarr / Radarr ด้วยตนเองแล้วและทำงานและไม่สามารถค้นหาโฟลเดอร์รากของพวกเขาดังนั้นพวกเขาให้ฉันข้อผิดพลาด

สิ่งที่ฉันต้องการจะทำคือสร้าง mountgdrive.service (บริการหรืออะไรก็ตามที่จำเป็น) เพื่อเปิดสคริปต์ check.mount โดยอัตโนมัติและหากยังไม่พอให้แทรกความล่าช้าใน sonarr.service และ radarr.service! เป็นไปได้ไหม

ฉันเขียนสิ่งนี้ด้วย sudo nano /etc/systemd/system/mountgdrive.service

[Unit]
Description=MountSmokeScreen
After=network.target

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target

และเพิ่มไปยัง sonarr.service และ radarr.service mountgdrive.serviceในAfter=บิตเช่นนี้

[Unit]
Description=Sonarr
After=syslog.target network.target mountgdrive.service

[Service]
User=samsepioldoresh4ze
etcetc
....

แต่มันไม่ทำงาน! Sonarr และ Radarr เริ่มต้นตามปกติ แต่ไดรฟ์ไม่ได้ติดตั้ง! ผมทำอะไรผิดหรือเปล่า?


นอกจากนี้ rtcwake ไม่ทำงานบนแล็ปท็อปของฉัน - ฉันคิดว่านี่เป็นปัญหาเคอร์เนล! มีวิธีแก้ไขไหม


1
ถ้าฉันเข้าใจถูกต้องคุณต้องการsonarr.serviceและradarr.serviceจะทำงานหลังจากที่mountgdrive.serviceขึ้นและทำงานอยู่?
ด่าน

@ แน่นอน! ปัญหาคือวิธีการที่ผมเขียนมันเห็นได้ชัดว่าmountgdrive.serviceทำงาน แต่ไม่ทำอะไรเลย (มันไม่ได้ติดตั้งไดรฟ์) แล้วsonarr.serviceและradarr.serviceทำงานได้ตามปกติเพราะอูบุนตูดำเนินการmountgdrive.service
samsepioldoloresh4ze

1
ฉันยังอยากจะแนะนำให้คุณมองเข้าไปในหน่วย.mount หากสิ่งที่คุณmountgdrive.serviceทำคือการติดตั้งไดเรกทอรีหรือคล้ายกันคุณอาจจะสามารถเปลี่ยนเป็น.mountบริการ มันทำให้มีความน่าเชื่อถือมากขึ้นเป็นพิเศษเนื่องจากคุณมีการพึ่งพามัน
ด่าน

คำตอบ:


26

เหตุผลที่คุณกำลังมีปัญหานี้เป็นเพราะคุณกำลังใช้After=ในขณะที่คุณยังต้องหรือRequires=Wants=

มี 3 คุณสมบัติหลักสำหรับการจัดการการพึ่งพา ฉันจะพยายามอธิบายความแตกต่างโดยย่อ แต่คุณสามารถหารายละเอียดเพิ่มเติมได้ที่[หน่วย] ส่วนตัวเลือก | freedesktop.org

  1. After=

    ตัวเลือกนี้จะกำหนดลำดับของหน่วยเท่านั้นมันไม่รับประกันว่าบริการจะเริ่มต้นขึ้น

  2. Wants=

    ตัวเลือกนี้ช่วยให้หน่วยของคุณเริ่มทำงานหลังจากหน่วยอื่นเริ่มต้นการทำงานเสร็จสิ้น (ไม่สำคัญว่าจะเริ่มต้นได้สำเร็จหรือไม่)

  3. Requires=

    เช่นเดียวWants=แต่นี้จะทำให้หน่วยของคุณเริ่มต้นเท่านั้นหลังจากที่อ้างอิงได้เริ่มต้นที่ประสบความสำเร็จ

คุณยังสามารถใช้อินเวอร์สของแต่ละตัวเลือกเหล่านั้น

  1. After= ถูกรุกรานโดย Before=
  2. Wants= ถูกรุกรานโดย WantedBy=
  3. Requires= ถูกรุกรานโดย RequiredBy=

ในการแก้ไขปัญหาของคุณคุณต้องเปลี่ยนบริการติดตั้งเป็น:

[Unit]
Description=MountSmokeScreen
After=network.target
Before=sonarr.service radarr.service

[Service]
Type=oneshot
ExecStart=/home/samsepioldoloresh4ze/bin/check.mount
TimeoutStopSec=20
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target sonarr.service radarr.service

หรือคุณสามารถเพิ่มWants=mountgdrive.serviceไปsonarr.serviceและradarr.serviceหน่วย

คุณสามารถทำได้โดยไม่ต้องแก้ไขไฟล์เริ่มต้นโดยเรียกใช้สิ่งต่อไปนี้ (คุณต้องทำเช่นเดียวกันradarr.service):

systemctl edit sonarr.service

และแทรกต่อไปนี้:

[Unit]
Wants=mountgdrive.service

หมายเหตุ: คุณสามารถแทนที่Wants=ด้วยRequiresหรือWantedBy=กับRequiredBy=ถ้าคุณไม่ต้องการให้บริการทั้งสองจะเริ่มต้นที่ทุกคนถ้าmountgdrive.serviceล้มเหลว (แม้ว่าWants=มักจะเพียงพอและแนะนำแม้ในเอกสาร)

แก้ไข: ตัวเลือกWantedByและRequiredByสามารถใช้ได้เฉพาะใน[Install]ส่วน (ขอบคุณ@Yankee )


ขอบคุณWants=และWantedBy=ฉันจะใช้มันอย่างแน่นอน !! ฉันได้รับข้อผิดพลาดนี้เมื่อฉันรีสตาร์ทแล็ปท็อปi.imgur.com/a3LE3G9.png
samsepioldoloresh4ze

1
ดูเหมือนว่าจะมีข้อผิดพลาดในสคริปต์ Can't open /.config/SmokeScreen/smokescreen.confคุณสามารถดูได้จากบรรทัดที่ลงท้ายด้วย บางทีคุณอาจมี "~ / .config / ... " ในสคริปต์ yoru คุณควรแทนที่เครื่องหมายตัวหนอน ( ~) ด้วยเส้นทางแบบเต็มเช่น/home/you_user_name/.config/....(หรือใช้เส้นทางสัมพัทธ์กับสคริปต์ของคุณ)
Dan

github.com/FourFingerLifeHug/SmokeScreen/blob/master/ ...... - นี่เป็นสคริปต์ check.mount ดังนั้นฉันควรเปลี่ยน $ (HOME) และ $ (bindir) ทั้งหมดด้วยพา ธ แบบเต็มหรือไม่ ขอบคุณ!
samsepioldoloresh4ze

1
@ samsepioldoloresh4ze อ๋อ$HOMEไม่สามารถใช้งานได้ในเวลาบูตเนื่องจากยังไม่มีผู้ใช้ที่ลงชื่อเข้าใช้
ด่าน

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