एक सेवा लिखना जो Xorg पर निर्भर करता है


30

मैं के लिए एक उपयोगकर्ता स्तर की सेवा लिखने की कोशिश कर रहा हूं redshift, और यह तब तक इंतजार करना होगा जब तक कि Xorg ऊपर और चल रहा हो। मेरी वर्तमान सेवा फ़ाइल इस प्रकार है:

[Unit]
Description=Redshift
After=graphical.target

[Service]
Environment=DISPLAY=:0
ExecStart=/bin/redshift -l 28:-13 -t 5300:3300 -b 0.80:0.91 -m randr
Restart=always

[Install]
WantedBy=default.target

हालांकि, ऐसा लगता है कि यह Xorg शुरू होने से पहले शुरू करने का प्रयास करता है, और मुझे मैन्युअल रूप से बाद में सेवा शुरू करनी होगी। मुझे लगता है कि मैं गलत After=लक्ष्य का उपयोग कर रहा हूं । कोई संकेत?

जवाबों:


20

मैं इस पर शोध कर रहा हूं और ग्रेविटी का जवाब पुराना है। अब आप उपयोगकर्ता सेवाओं को सिस्टमड के साथ सेटअप कर सकते हैं जो उपयोगकर्ता के सत्र के हिस्से के रूप में चलती हैं। उनके पास DISPLAY और XAUTHORITY सेट हो सकता है (वर्तमान में आर्क और डेबियन स्ट्रेच में)।

यह डेस्कटॉप ऑटोस्टार्ट फ़ाइलों का उपयोग करने की पिछली सिफारिशों पर समझ में आता है, जैसा कि आप प्रक्रिया प्रबंधन प्राप्त करते हैं जैसे आप एक सिस्टम स्तर एप्लिकेशन (पुनरारंभ, आदि) करते हैं।

सर्वश्रेष्ठ डॉक्स अभी आर्क विकी है; Systemd / उपयोगकर्ता

TLDR संस्करण;

  1. वांछित * .service फ़ाइल में बनाएँ ~/.config/systemd/user/
  2. रन systemctl --user enable [service](बहिष्कृत .service प्रत्यय)
  3. systemctl --user start [service]अब शुरू करने के लिए वैकल्पिक रूप से चलाएं
  4. systemctl --user status [service]यह कैसे किया जाता है यह जाँचने के लिए उपयोग करें

कुछ अन्य उपयोगी आदेश।

  • systemctl --user list-unit-files - सभी उपयोगकर्ता इकाइयों को देखें
  • s ystemctl --user daemon-reload- यदि आप एक .service फ़ाइल संपादित करते हैं

-- बाद में...

मैंने अपने अधिवेशन के अधिकांश डेमों को सिस्टमडास सर्विस फ़ाइलों में अपग्रेड किया और परिवर्तित किया। इसलिए मैं कुछ अतिरिक्त नोट्स जोड़ सकता हूं।

लॉगिन पर सेवाओं को चलाने के लिए कोई डिफ़ॉल्ट हुक नहीं था, इसलिए आपको इसे स्वयं ट्रिगर करना होगा। मैं इसे अपने ~ / .xsession फ़ाइल से करता हूं।

systemctl --user import-environment PATH DBUS_SESSION_BUS_ADDRESS
systemctl --no-block --user start xsession.target

पहली पंक्ति कुछ पर्यावरण चर को सिस्टमड उपयोगकर्ता सत्र में आयात करती है और दूसरी लक्ष्य से दूर हो जाती है। मेरी xsession.target फ़ाइल;

[Unit]
Description=Xsession running
BindsTo=graphical-session.target

एक उदाहरण के रूप में मेरा xbindkeys.service।

[Unit]
Description=xbindkeys
PartOf=graphical-session.target

[Service]
ExecStart=/usr/bin/xbindkeys -n -f ${HOME}/projects/dotfiles/.xbindkeysrc
Restart=always

[Install]
WantedBy=xsession.target

2
यदि आप एक उदाहरण इकाई फ़ाइल प्रदान कर सकते हैं, और यह बता सकते हैं कि इकाई का उपयोग कैसे किया जा सकता है, तो आप DISPLAY और XAUTHORITY का उपयोग कर सकते हैं, मुझे स्वीकृत उत्तर स्विच करने में खुशी होगी।
मकाटो

@ मैकिटो मैं उस पर गौर करूंगा कि एक बार डेबियन स्ट्रैच जारी करता है। मैं डेबियन स्थिर चल रहा हूं और तब तक इंतजार कर रहा था जब तक कि इसके साथ और अधिक खेलने के लिए नहीं।
जॉन इकेनबेरी

@mkaito at github.com/systemd/systemd/blob/v219/NEWS#L194 का कहना है कि "एक X11 सत्र की स्क्रिप्ट को अब भेज दिया गया है जो किसी सत्र के शुरू होने पर systemd-user डेमन के वातावरण में $ DISPLAY और $ XAUTHHITY अपलोड करता है। इसे सिस्टम उपयोगकर्ता सेवाओं के रूप में चलने वाले X11 सक्षम अनुप्रयोगों के साथ संगतता में सुधार करना चाहिए। "
जॉसच

मैं अभी भी एक उदाहरण इकाई फ़ाइल देखना चाहूंगा, बस यह स्पष्ट करने के लिए कि क्या कुछ विशेष आवश्यक है।
mitoito

11

सामान्य संकेत "नहीं" है। redshiftएक सिस्टम-वाइड सेवा नहीं है - इसका प्रत्येक सत्र के लिए एक अलग उदाहरण होगा , और यह उस विशिष्ट सत्र के Xorg से कैसे कनेक्ट किया जाए, इसके बारे में जानने की आवश्यकता है।

(Xorg एक सिस्टम सेवा नहीं है - केवल प्रदर्शन प्रबंधक है, और यह प्रत्येक सत्र के लिए एक अलग Xorg भी लॉन्च करता है। // graphical.targetआपको बताएगा कि प्रदर्शन प्रबंधक कब तैयार होता है, लेकिन यह इस बारे में कुछ नहीं कहता है कि वास्तव में DM कब शुरू होता है। पहला - या सभी - प्रदर्शित करता है।)

बस इसे बूट के साथ शुरू करना DISPLAY=:0पर्याप्त नहीं है, क्योंकि इसमें कोई गारंटी नहीं है कि किसी भी समय बिल्कुल एक ही डिस्प्ले है, और न ही यह हमेशा है :0(उदाहरण के लिए, अगर Xorg एक बासी लॉकफाइल को छोड़कर दुर्घटनाग्रस्त हो जाता है, तो अगले एक के :1रूप में चलेगा लगता :0है कि अभी भी कब्जा है); आपको अपनी XAUTHORITYफ़ाइल में पथ सेट करने की भी आवश्यकता है क्योंकि X11 को प्रमाणीकरण की आवश्यकता होती है; और सुनिश्चित करें कि redshiftयदि आप कभी लॉग आउट करते हैं और फिर से लॉग इन करते हैं तो पुनः आरंभ होता है।

तो इसे कैसे शुरू करें? लगभग हमेशा, डेस्कटॉप वातावरण में अपनी सत्र सेवाएँ शुरू करने के कई तरीके होते हैं। एक पुरानी पोस्ट देखें जो पहले से ही दो सामान्य लोगों का वर्णन करती है; ~/.xprofileस्क्रिप्ट और ~/.config/autostart/*.desktopस्थान।

यदि आप startx का उपयोग करते हैं , तो आप ~/.xinitrcऐसी चीजों को शुरू करने के लिए उपयोग कर सकते हैं। स्टैंडअलोन विंडो प्रबंधकों के पास अक्सर अपने स्वयं के स्टार्टअप / इनिट स्क्रिप्ट होते हैं; उदाहरण के ~/.config/openbox/autostartलिए Openbox।

इन सभी विधियों में सामान्य बात यह है कि कार्यक्रम को सत्र के भीतर से शुरू किया गया है - ऊपर सूचीबद्ध सभी समस्याओं से बचना।


जबकि Redshift कई मामलों में एक प्रणाली-व्यापी सेवा नहीं है, यह एक उपयोगकर्ता सेवा होने के लिए समझ में आता है, जो ठीक वही है जो ओपी करने की कोशिश कर रहा है।
सिमोटेक

5

यहाँ मैं अभी तक उपलब्ध नहीं है graphical-session.target(मेरे Kubuntu 16.04 प्रणाली पर) के रूप में काम करने के लिए बनाया है :

  1. एक छद्म प्रणालीधारी उपयोगकर्ता इकाई बनाएं जो ग्राफिकल- सेशन.टार्ग को ऊपर और नीचे ले आए।

~/.config/systemd/user/xsession.targetनिम्नलिखित सामग्रियों से बनाएं :

[यूनिट]
विवरण = Xsession ऊपर और चल रहा है
BindsTo = graphical-session.target

इस नई इकाई के बारे में systemd को बताएं:

$> systemctl --user daemon-reload
  1. ऑटोटार्ट और शटडाउन स्क्रिप्ट बनाएं जो xsession.targetउबंटू 16.04 डेस्कटॉप के वर्तमान में उपलब्ध यांत्रिकी के माध्यम से नियंत्रित करता है ।

~/.config/autostart-scripts/xsession.target-login.shनिम्नलिखित सामग्रियों से बनाएं :

#! / Bin / bash

अगर ! systemctl --user सक्रिय xsession.target &> / dev / null है
फिर
  / बिन / systemctl -user आयात-पर्यावरण प्रदर्शन XAUTHORITY
  / बिन / systemctl --user xsession.target प्रारंभ करें
फाई

~/.config/plasma-workspace/shutdown/xsession.target-logout.shनिम्नलिखित सामग्रियों से बनाएं :

#! / Bin / bash

अगर systemctl --user सक्रिय xsession.target &> / dev / null है
फिर
  / बिन / systemctl --user xsession.target रोकें
फाई

स्क्रिप्ट को निष्पादन योग्य बनाएं:

$> chmod + x ~ / .config / ऑटोस्टार्ट-स्क्रिप्ट / xsession.target-login.sh
$> chmod + x ~ / .config / प्लाज्मा-कार्यक्षेत्र / बंद / xsession.target-outout.sh

नोट: इन दो फ़ाइलों को रखा गया है जहां केडीई उन्हें ऑटोस्टार्ट और शटडाउन के लिए ले जाएगा। फाइलें शायद अन्य डेस्कटॉप वातावरणों (जैसे सूक्ति) के लिए कहीं और रखी गई हैं - लेकिन मैं उन वातावरणों के बारे में नहीं जानता।

नोट: इस वर्कअराउंड में मल्टी डेस्कटॉप सेशन का समर्थन नहीं है। यह केवल graphical-session.targetसही ढंग से संभालता है जब तक कि मशीन पर केवल एक सक्रिय X11 सत्र चलाया जाता है (लेकिन यह हमारे अधिकांश लिनक्स उपयोगकर्ताओं के लिए मामला है)।

  1. अपनी स्वयं की सिस्टमड उपयोगकर्ता इकाइयाँ बनाएँ, जो graphical-session.targetआपके डेस्कटॉप पर लॉग इन होने पर निर्भर करती हैं और उन्हें साफ-सुथरी रूप से चलाती हैं।

उदाहरण के लिए @ mkaito की इकाई को इस तरह दिखना चाहिए:

[यूनिट]
विवरण = Redshift
PartOf = graphical-session.target

[सेवा]
ExecStart = / bin / redshift -l 28: -13 -t 5300: 3300 -b 0.80: 0.91-m रेंडर
पुनः प्रारंभ हमेशा =

( daemon-reloadअपनी इकाइयों को संपादित करने के बाद करना न भूलें !)

  1. अपनी मशीन को रिबूट करें, लॉगिन करें और अपनी इकाइयों को अपेक्षित रूप से चालू करें
$> systemctl --user स्थिति चित्रमय- session.target
● ग्राफिकल- session.target - वर्तमान ग्राफिकल उपयोगकर्ता सत्र
   भरी हुई: भरी हुई (/usr/lib/systemd/user/graphical-session.target; स्थिर; विक्रेता पूर्व निर्धारित: सक्षम)
   सक्रिय: डॉन 2017-01-05 15:08:42 सीईटी के बाद से सक्रिय; 47 मिनट पहले
     डॉक्स: आदमी: systemd.special (7)
$> systemctl --user स्थिति आपकी इकाई ...

कुछ भविष्य के दिन (क्या यह उबुन्टु 17.04 होगा?) मेरा वर्कअराउंड अप्रचलित हो गया क्योंकि सिस्टम graphical-session.targetसही ढंग से खुद को संभाल लेगा । उस दिन बस ऑटोस्टार्ट और शटडाउन स्क्रिप्ट को हटा दें और यह भी xsession.target- आपकी कस्टम उपयोगकर्ता इकाइयां अछूती रह सकती हैं और बस काम कर सकती हैं।


मुझे पता है कि यह एक पुरानी टिप्पणी है, लेकिन आप कार्यस्थान> स्टार्टअप और शटडाउन> ऑटोस्टार्ट के तहत सिस्टम सेटिंग्स ऐप के माध्यम से स्टार्टअप / लॉगिन स्क्रिप्ट भी जोड़ सकते हैं, यदि आप उन स्क्रिप्ट को एक जगह पर रखना चाहते हैं तो आप उन्हें याद रखेंगे।
AmbientCyan

2

यह समाधान वही करता है जो लेखक का प्रश्न पूछता है:

Xorg उठने और चलने तक इंतजार करना होगा

हालांकि, इसे करने के बेहतर तरीके हो सकते हैं, जैसा कि पहले से ही अन्य उपयोगकर्ताओं द्वारा उत्तर दिया गया है, यह इस समस्या का एक और तरीका है।

यह systemd के systemd-networkd-wait-online -service के समान है जो कुछ मानदंडों को पूरा करने तक ब्लॉक करता है। अन्य सेवाएं जो इस पर निर्भर करती हैं, जैसे ही यह सेवा सफलतापूर्वक शुरू होगी या समय से शुरू होगी।

प्रति पुस्तिका (अनुभाग "फ़ाइलें"), X सर्वर एक UNIX सॉकेट पैदा करेगा /tmp/.X11-unix/Xn(जहां nएक प्रदर्शन संख्या है)।

इस सॉकेट की उपस्थिति की निगरानी करके हम यह निर्धारित कर सकते हैं कि विशेष प्रदर्शन के लिए सर्वर शुरू हो गया है।

confirm_x_started.sh:

#!/bin/bash
COUNTER=0

while [ 1 ]
do
  # Check whether or not socket exists
  if [ -S /tmp/.X11-unix/X0 ]
  then
    exit 0
  fi

  ((++COUNTER))

  if [ $COUNTER -gt 20 ]
  then
    exit 1
  fi

  sleep 0.5
done

x_server_started.service:

[Unit]
Description=Monitor X server start

[Service]
Type=oneshot
ExecStart=/path/to/confirm_x_started.sh

[Install]
WantedBy=example.target

अब, x_server_started.serviceएक्स सर्वर के साथ एक ही समय में शुरू करने के लिए सक्षम करें।

अन्य सेवाओं (जिस पर एक्स सर्वर शुरू होने की आवश्यकता है) पर निर्भर करें x_server_started.service

निर्भर इकाई:

[Unit]
Description=Service that needs to have the X server started
Requires=x_server_started.service
After=x_server_started.service

[Service]
ExecStart=/path/to/binary

[Install]
WantedBy=example.target

यदि एक्स सर्वर बिना किसी समस्या के शुरू होता है, तो x_server_started.serviceलगभग तुरंत शुरू हो जाएगा और सिस्टमड उन सभी इकाइयों को शुरू करने के लिए आगे बढ़ेगा जो निर्भर हैं x_server_started.service


यह अच्छी तरह से काम करता है। अतिरिक्त सेवा एक अच्छा स्पर्श है। आप अपनी लक्ष्य सेवा में केवल ExecStartPre का भी उपयोग कर सकते हैं। मुझे 'एक्जिट 0' से पहले एक अतिरिक्त 'स्लीप 1' जोड़ना था, हालांकि, ऐसा लगता है कि यह सिर्फ कोशिश करने और उसे तुरंत पकड़ने के लिए बहुत तेज़ था।
टीटीमो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.