নেটওয়ার্কটি অনলাইনে না হওয়া পর্যন্ত আমি কীভাবে আমার ব্যবহারকারী পরিষেবাগুলি অপেক্ষা করতে পারি?


15

আমি বেশ কয়েকটি সিস্টেমড ইউজার সার্ভিস ফাইল লিখেছি যা ব্যবহারকারীরা সক্ষম করতে চান এবং যার জন্য একটি ওয়ার্কিং নেটওয়ার্ক সংযোগ প্রয়োজন। আমি ভেবেছিলাম যে এটি হিসাবে সহজ হবে:

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.

এবং আবার পরিষেবাটি খুব তাড়াতাড়ি শুরু হয়।

সেখানে কি সেই বার্তা থাকার কথা? আমি কীভাবে আমার সমস্যাটি ডিবাগ করতে পারি?


সম্পাদনা : কারণটি সহজ এবং আর্ক উইকিতে সুনির্দিষ্টভাবে বলা হয়েছে :

systemd --userপ্রক্রিয়া থেকে পৃথক প্রক্রিয়া হিসাবে চালিত systemd --system। ব্যবহারকারী ইউনিটগুলি সিস্টেম ইউনিটের উপর নির্ভর করতে বা নির্ভর করতে পারে না।

এই ফোরাম পোস্টটি একটি সহজ সমাধানের পরামর্শ বলে মনে হচ্ছে: linkএকজন ব্যবহারকারী হিসাবে আমার প্রয়োজনীয় সিস্টেম ইউনিট হওয়া উচিত , সুতরাং ইউনিট অনুসন্ধানের পথে এটিতে একটি সিমলিংক তৈরি করা উচিত।

এটি করার পরে, আমি কোনও 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.

আমি আশা করি আপনার একটি উত্তর হবে।

@ ডিলিটমে ধন্যবাদ, আমি মনে করি আমি এর কারণ খুঁজে পেয়েছি (আপডেট দেখুন), তবে কীভাবে সমস্যার সমাধান করবেন তা নয়।
লেভ লেভিটস্কি

আপনি প্রত্যেকে কি এই সমস্যার সমাধান খুঁজে পেয়েছেন? এছাড়াও, আমি লক্ষ্য করেছি যে আপনি জোর দিয়েছিলেন যে কেবল কয়েকটি লিঙ্কযুক্ত ইউনিট মারা গেছে। কোনটি কাজ করেছে এবং তারা কীভাবে আলাদা?
স্পারহাক

@ স্পারহাক দুর্ভাগ্যক্রমে নয়। কার্যকারণ হিসাবে, আমি বুট করার পরে বেশ কয়েক সেকেন্ডে সেট টাইমার ব্যবহার করি। প্রশ্নের একটি উদাহরণ রয়েছে: নেটওয়ার্ক-অনলাইন লক্ষ্য সংযোগের পরে সক্রিয়, এবং নেটওয়ার্ক টার্গেটটি নয়।
লেভ লেভিটস্কি

সম্ভবত আমি ভুল বুঝেছি, তবে স্থগিতাদেশ থেকে পুনরায় শুরু করার পরে আমার ইমেল চেক করার জন্য প্রতিবার নেটওয়ার্কটি পুনরায় চালু হওয়ার সময় আমি গুলি চালানোর জন্য কিছু সন্ধান করছি । আমি ভেবেছিলাম এটি করার উপায় হবে। আমি উদাহরণ এখন দেখতে। আমি ভেবেছিলাম আপনার অর্থ কিছু কাস্টম পরিষেবাদি বরখাস্ত হয়েছে এবং কিছুগুলি তা করেনি। তবে, আমি এখন দেখছি আপনি নেটওয়ার্ক টার্গেটের ব্যবহারকারী সংস্করণগুলি সম্পর্কে কথা বলছেন।
স্পারহাক

উত্তর:


3

যেহেতু আপনি কোনও সিস্টেম পরিষেবার উপর নির্ভর করতে পারবেন না, আপনার একমাত্র সমাধানটি হ'ল কোনও ব্যবহারকারী পরিষেবা সরবরাহ করা যা নেটওয়ার্কটি অনলাইন কিনা তা সনাক্ত করে। (বা আপনার পরিষেবাদি সিস্টেম পরিষেবাগুলি তৈরি করুন)) "সনাক্তকরণ-অনলাইন" ব্যবহারকারী পরিষেবাটির বিশদগুলি আপনার "অনলাইন" সংজ্ঞাটির উপর নির্ভর করবে। এটি সফলতার জন্য 8.8.8.8 এর পিংয়ের জন্য অপেক্ষা করতে পারে। অথবা একটি ডিএনএস নামের রেজোলিউশন সফল হওয়ার জন্য। উদাহরণস্বরূপ, ভিপিএনসি-র সাথে একই পরিস্থিতিতে, আমি ভিপিএন আইপি-তে পিংয়ের জন্য অপেক্ষা করি।

তারপরে আপনি আপনার ব্যবহারকারীর পরিষেবাগুলিকে আপনার সনাক্ত-অনলাইন ব্যবহারকারী পরিষেবাটির (পরে =) নির্ভর করতে পারেন।

#!/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 টি উদাহরণ থাকবে, যা কিছুটা অপ্রয়োজনীয় বলে মনে হয়। অনুশীলনে সম্ভবত এটি ইস্যুতে নয়, তবে আমি এটি ব্যবহারকারীর সমস্ত পরিষেবায় একটি একক "অনলাইন পতাকা" পাওয়ার আশায় জিজ্ঞাসা করছিলাম। যদিও এর থেকে আরও ভাল সমাধানের প্রস্তাব দেওয়া হয়নি।
লেভ লেভিটস্কি

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
তবে এটি একটি সিস্টেম পরিষেবা এবং আমি একটি ব্যবহারকারী পরিষেবা সেট আপ করার চেষ্টা করছি।
লেভ লেভিটস্কি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.