ฉันจะทำให้บริการผู้ใช้รอจนกระทั่งเครือข่ายออนไลน์ได้อย่างไร


15

ฉันได้เขียนไฟล์บริการผู้ใช้ systemd สองไฟล์ซึ่งฉันต้องการให้ผู้ใช้เปิดใช้งานและต้องการการเชื่อมต่อเครือข่ายที่ใช้งานได้ ฉันคิดว่าจะง่ายเหมือน:

Wants=network-online.target
After=network-online.target

อย่างไรก็ตามบริการดูเหมือนจะเริ่มเร็วเกินไปและในjournalctlฉันเห็น:

network-online.target: Cannot add dependency job, ignoring: Unit network-online.target failed to load: No such file or directory.

จากนั้นฉันค้นหาเพิ่มเติมและลอง

Wants=network.target
After=network.target

sudo systemctl enable systemd-networkd-wait-online.serviceและทำ

ตอนนี้ฉันมีในjournalctl:

network.target: Cannot add dependency job, ignoring: Unit network.target failed to load: No such file or directory.

และอีกครั้งบริการเริ่มเร็วเกินไป

ข้อความนั้นควรจะอยู่ที่นั่นหรือไม่? ฉันจะแก้ไขปัญหาของฉันได้อย่างไร


แก้ไข : เหตุผลง่ายและระบุไว้เฉพาะในArch Wiki :

systemd --userทำงานเป็นกระบวนการแยกจากsystemd --systemกระบวนการ หน่วยผู้ใช้ไม่สามารถอ้างอิงหรือขึ้นอยู่กับหน่วยระบบ

โพสต์ฟอรัมนี้ดูเหมือนจะแนะนำวิธีแก้ปัญหาง่ายๆ: ฉันควรจะlinkมีหน่วยระบบที่จำเป็นในฐานะผู้ใช้ดังนั้นจึงสร้าง symlink ที่มีอยู่ในพา ธ การค้นหาหน่วย

หลังจากทำเช่นนั้นฉันไม่เห็นNo such file or directoryข้อความใด ๆแต่ฉันยังคงไม่สามารถให้บริการได้จริง ๆ หลังจากเครือข่ายออนไลน์ ฉันได้พยายามเชื่อมโยงnetwork.target, network-online.targetและsystemd-networkd-wait-online.serviceการตั้งค่าหน่วยของฉันไปขึ้นอยู่กับแต่ละของพวกเขาไม่ประสบความสำเร็จ เมื่อฉันตรวจสอบสถานะของหน่วยที่เชื่อมโยงในโหมดผู้ใช้ พวกเขาทั้งหมดจะมีบางอย่างที่ไม่ทำงานเช่น:

$ systemctl --user status network.target
● network.target - Network
   Loaded: loaded (/usr/lib/systemd/system/network.target; linked; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:systemd.special(7)
           http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget
$ systemctl status network.target
● network.target - Network
   Loaded: loaded (/usr/lib/systemd/system/network.target; static; vendor preset: disabled)
   Active: active since Sat 2015-07-18 19:20:11 MSK; 3h 35min ago
     Docs: man:systemd.special(7)
           http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget

Jul 18 19:20:11 calc-server systemd[1]: Reached target Network.
Jul 18 19:20:11 calc-server systemd[1]: Starting Network.

อย่างไรก็ตามฉันสามารถเห็นการnetwork-online.targetใช้งานในโหมดผู้ใช้หลังจากเชื่อมโยง:

$ systemctl --user status network-online.target
● network-online.target - Network is Online
   Loaded: loaded (/usr/lib/systemd/system/network-online.target; linked; vendor preset: enabled)
   Active: active since Sun 2015-07-19 00:35:38 MSK; 2min 48s ago
     Docs: man:systemd.special(7)
           http://www.freedesktop.org/wiki/Software/systemd/NetworkTarget

Jul 19 00:35:38 calc-server systemd[469]: Reached target Network is Online.
Jul 19 00:35:38 calc-server systemd[469]: Starting Network is Online.

ฉันหวังว่าคุณจะได้คำตอบ

@ Deleteme ขอบคุณฉันคิดว่าฉันพบสาเหตุของเรื่องนี้ (ดูอัปเดต) แต่ไม่ใช่วิธีการแก้ปัญหา
Lev Levitsky

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

@Sparhawk โชคไม่ดี วิธีแก้ปัญหาคือฉันเพิ่งใช้ตัวจับเวลาตั้งค่าหลายวินาทีหลังจากบูต คำถามมีตัวอย่าง: เป้าหมายเครือข่ายออนไลน์ใช้งานได้หลังจากเชื่อมโยงและเป้าหมายเครือข่ายไม่ได้
Lev Levitsky

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

คำตอบ:


3

เนื่องจากคุณไม่สามารถพึ่งพาบริการระบบโซลูชันเดียวของคุณคือให้บริการผู้ใช้ที่ตรวจพบว่าเครือข่ายออนไลน์ (หรือทำให้บริการระบบบริการของคุณ) รายละเอียดสำหรับบริการผู้ใช้ "ตรวจหาออนไลน์" จะขึ้นอยู่กับคำจำกัดความของคุณว่า "ออนไลน์" มันสามารถรอให้ ping 8.8.8.8 ประสบความสำเร็จเป็นต้น หรือสำหรับการแก้ไขชื่อ DNS ให้สำเร็จ ตัวอย่างเช่นในสถานการณ์ที่คล้ายกันกับ vpnc ฉันรอให้ ping กับ vpn IP ประสบความสำเร็จ

จากนั้นคุณสามารถทำให้บริการผู้ใช้ของคุณขึ้นอยู่กับ (หลังจาก =) บริการตรวจสอบออนไลน์ของคุณ

#!/bin/sh

host="${1:-8.8.8.8}"

pingcheck() {
  ping -n -c 1 -w 5 $1 >/dev/null 2>&1
}

# Do you want a timeout ?
while :; do
  pingcheck ${host} && exit 0
  sleep 10
done

ขอบคุณดูเหมือนสมเหตุสมผลและเรียบง่ายพอ แต่ถ้าผู้ใช้ 10 คนเปิดใช้งานบริการผู้ใช้ของฉันจะมี 10 ครั้งที่ส่งเซิร์ฟเวอร์เดียวกันพร้อมกันซึ่งดูเหมือนจะซ้ำซ้อนกันเล็กน้อย ในทางปฏิบัติสิ่งนี้อาจไม่เป็นปัญหา แต่ฉันถามเรื่องนี้ด้วยความหวังว่าจะได้รับ "การตั้งค่าสถานะออนไลน์" สำหรับบริการผู้ใช้ทั้งหมด แม้ว่าจะยังไม่มีการแนะนำวิธีแก้ไขที่ดีกว่า
Lev Levitsky

1

ฉันอยากจะแนะนำให้ทดสอบสิ่งนี้:

# /etc/systemd/system/foo.service
[Unit]
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/bin/logger -t foo "testing online target"

[Install]
WantedBy=multi-user.target

ติดตามโดย:

# systemctl daemon-reload && systemctl enable foo.service

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