Xorg এর উপর নির্ভর করে এমন একটি পরিষেবা রচনা


30

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

[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

যাইহোক, দেখে মনে হচ্ছে এটি জর্গ শেষ হওয়ার আগেই শুরু করার চেষ্টা করে এবং এরপরে আমাকে ম্যানুয়ালি পরিষেবাটি শুরু করতে হবে। আমার ধারণা আমি ভুল After=লক্ষ্য ব্যবহার করছি কোন ইঙ্গিত?

উত্তর:


20

আমি এটি নিয়ে গবেষণা করে চলেছি এবং মাধ্যাকর্ষণ উত্তরটি পুরানো বলে মনে হচ্ছে। আপনি এখন সিস্টেমডের সাহায্যে ব্যবহারকারী পরিষেবাগুলি সেটআপ করতে পারেন যা ব্যবহারকারীর সেশনের অংশ হিসাবে চালিত হয়। তাদের মধ্যে প্রদর্শন এবং XAUTHORITY সেট থাকতে পারে (বর্তমানে আর্চ এবং ডিবিয়ান স্ট্রেচে)।

আপনি ডেস্কটপ অটোস্টার্ট ফাইলগুলি ব্যবহার করার পূর্ববর্তী সুপারিশগুলিতে এটি বোঝা যায়, যেমন আপনি কোনও সিস্টেম স্তরের অ্যাপ (পুনঃসূচনা ইত্যাদি) এর মতো প্রক্রিয়া পরিচালনা পান।

এখনই সেরা ডক্স হ'ল আর্ক উইকি; Systemd / ব্যবহারকারী

টিএলডিআর সংস্করণ;

  1. কাঙ্ক্ষিত *। পরিষেবা ফাইলটি এতে তৈরি করুন ~/.config/systemd/user/
  2. চালান systemctl --user enable [service](সার্ভিস প্রত্যয় বাদ দিন)
  3. systemctl --user start [service]এখনই শুরু করতে ptionচ্ছিকভাবে চালান
  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
আপনি যদি ইউনিট ফাইলের একটি উদাহরণ সরবরাহ করতে পারেন এবং ইউনিটটি কীভাবে ডিজিট এবং XAUTHORITY ব্যবহার করতে সক্ষম হবে তা ব্যাখ্যা করতে পারেন, আমি গৃহীত উত্তরটি স্যুইচ করে খুশি হব।
এমকেইটো

@ এমকায়েটো আমি একবার এটি দেখব ডেবিয়ান স্ট্রেচ প্রকাশের পরে। আমি ডেবিয়ান স্থিতিশীল চালাচ্ছি এবং আরও কিছুটা খেলতে ততক্ষণ অপেক্ষা করছিলাম।
জন

@ এমকাইটো github.com/systemd/systemd/blob/v219/NEWS#L194 এ বলা হয়েছে "একটি এক্স 11 সেশন স্ক্রিপ্টলেট এখন পাঠানো হয়েছে যে সেশন শুরু হলে সিস্টেমড - ইউজার ডিমন পরিবেশে $ DISPLAY এবং $ XAUTHORITY আপলোড করে। এটি সিস্টেমড ব্যবহারকারী পরিষেবা হিসাবে চালিত এক্স 11 সক্ষম অ্যাপ্লিকেশনগুলির সাথে সামঞ্জস্যতা উন্নত করা উচিত। "
জোশ

আমি এখনও একটি ইউনিট ফাইল দেখতে চাই, কেবল বিশেষ কিছু প্রয়োজন আছে কিনা তা পরিষ্কার করার জন্য।
এমকেইটো

11

স্বাভাবিক ইঙ্গিতটি "না"। redshiftকোনও সিস্টেম-ব্যাপী পরিষেবা নয় - এটি প্রতিটি সেশনের জন্য একটি পৃথক উদাহরণ থাকতে পারে এবং সেই নির্দিষ্ট অধিবেশনটির জর্গে কীভাবে সংযোগ স্থাপন করবেন সে সম্পর্কে এটি জানতে হবে।

(উপলব্ধকারী Xorg একটি সিস্টেম সেবা পারেন না - শুধুমাত্র প্রদর্শন ম্যানেজার , এবং এটা প্রতিটি সেশনের জন্য একটি পৃথক উপলব্ধকারী Xorg আরম্ভ করা //। graphical.targetআপনাকে বলতে হবে যখন প্রদর্শন ব্যবস্থাপক প্রস্তুত, কিন্তু এটা যখন ডিএম আসলে শুরু হয় সম্পর্কে কিছুই বলছেন প্রথম - বা সমস্ত - প্রদর্শন।)

বুট দিয়ে এটি শুরু করা DISPLAY=:0যথেষ্ট নয়, কারণ কোনও নির্দিষ্ট সময়ে ঠিক একটি প্রদর্শন রয়েছে কিনা এমন কোনও গ্যারান্টি নেই, বা এটি সর্বদা হয় :0(উদাহরণস্বরূপ, যদি জর্গ কোনও বাসি লকফিল রেখে ক্র্যাশ করে, তবে পরেরটি :1এটির মতো চালানো হবে) মনে :0হবে এখনও দখল আছে); XAUTHORITYএক্স 11 এর প্রমাণীকরণের প্রয়োজন হওয়ায় আপনার ফাইলের পথও নির্ধারণ করতে হবে; এবং redshiftআপনি যদি কখনও লগ আউট করে এবং আবার লগ ইন করেন তবে পুনরায় চালু হবে তা নিশ্চিত করুন ।

এটা কিভাবে শুরু করবেন? প্রায় সর্বদা, ডেস্কটপ পরিবেশের নিজস্ব সেশন পরিষেবা শুরু করার বিভিন্ন পদ্ধতি রয়েছে starting একটি পুরানো পোস্ট দেখুন যা ইতিমধ্যে দুটি স্বাভাবিক পোস্ট বর্ণনা করে; ~/.xprofileস্ক্রিপ্ট এবং ~/.config/autostart/*.desktopঅবস্থান।

আপনি যদি স্টার্টেক্স ব্যবহার করেন তবে আপনি এই ~/.xinitrcজাতীয় জিনিসগুলি শুরু করতে ব্যবহার করতে পারেন । একক উইন্ডো পরিচালকদের প্রায়শই নিজস্ব স্টার্টআপ / আরআর স্ক্রিপ্ট থাকে; যেমন ~/.config/openbox/autostartওপেনবক্সের জন্য।

এসব সব পদ্ধতি সাধারণ যে প্রোগ্রাম থেকে শুরু হয় মধ্যে উপরে তালিকাভুক্ত সব সমস্যার এড়ানো - সেশন।


যদিও রিডশিফ্ট অনেক ক্ষেত্রে সিস্টেম-ব্যাপী পরিষেবা না হলেও এটি ব্যবহারকারী পরিষেবা হিসাবে বোধগম্য হয় যা ঠিক ওপি যা করার চেষ্টা করছে।
সিমোটেক

5

আমি সবেমাত্র এমনটি তৈরি করেছি যা এখনও উপলভ্য নয় graphical-session.target(আমার কুবুন্টু 16.04 সিস্টেমে):

  1. একটি সিউডো সিস্টেমযুক্ত ব্যবহারকারী ইউনিট তৈরি করুন যা গ্রাফিকাল-নির্ধারণ.আর্টেজকে উপরে এবং নীচে নিয়ে আসে।

~/.config/systemd/user/xsession.targetনিম্নলিখিত বিষয়বস্তু সহ তৈরি করুন :

[ইউনিট]
বর্ণনা = এক্সেসিওন আপ এবং চলমান
BindsTo = graphical-session.target

সিস্টেমডকে এই নতুন ইউনিট সম্পর্কে বলুন:

$> systemctl --user daemon-reload
  1. উবুন্টু 16.04 ডেস্কটপের বর্তমানে উপলব্ধ মেকানিক্সের মাধ্যমে নিয়ন্ত্রণ করে এমন অটোস্টার্ট এবং শাটডাউন স্ক্রিপ্ট তৈরি করুন xsession.target

~/.config/autostart-scripts/xsession.target-login.shনিম্নলিখিত বিষয়বস্তু সহ তৈরি করুন :

#! / বিন / ব্যাশ

যদি! systemctl --user - সক্রিয় xsession.target &> / dev / নাল
তারপর
  / bin / systemctl - ব্যবহারকারীর আমদানি-পরিবেশ DIY XAUTHORITY প্রদর্শন করুন
  / bin / systemctl - ব্যবহারকারীর প্রারম্ভিক xsession.target
ফাই

~/.config/plasma-workspace/shutdown/xsession.target-logout.shনিম্নলিখিত বিষয়বস্তু সহ তৈরি করুন :

#! / বিন / ব্যাশ

যদি systemctl --user- সক্রিয় xsession.target &> / dev / নাল
তারপর
  / bin / systemctl - ব্যবহারকারীর স্টপ xsession.target
ফাই

স্ক্রিপ্টগুলি সম্পাদনযোগ্য করুন:

$> chmod + x ~ / .config / অটোস্টার্ট-স্ক্রিপ্টগুলি / xsession.target-login.sh
mod> chmod + x ~ / .config / প্লাজমা-ওয়ার্কস্পেস / শাটডাউন / xsession.target-logout.sh

দ্রষ্টব্য: এই দুটি ফাইল স্থাপন করা হয়েছে যেখানে কে-ডি-ই সেগুলি অটোস্টার্ট এবং শাটডাউনয়ের জন্য তুলবে। ফাইলগুলি সম্ভবত অন্য ডেস্কটপ পরিবেশের জন্য অন্য কোথাও স্থাপন করেছে (যেমন জিনোম) - তবে আমি সেই পরিবেশগুলি সম্পর্কে জানি না।

দ্রষ্টব্য: এই কর্মক্ষেত্রে একাধিক ডেস্কটপ সেশনের সমর্থন নেই। এটি কেবলমাত্র graphical-session.targetসঠিকভাবে পরিচালনা করে যতক্ষণ না একটি মেশিনে কেবলমাত্র একটি সক্রিয় এক্স 11 সেশন চালিত হয় (তবে আমাদের বেশিরভাগ লিনাক্স ব্যবহারকারীদের ক্ষেত্রে এটিই)।

  1. আপনার নিজস্ব সিস্টেমযুক্ত ব্যবহারকারী ইউনিট তৈরি করুন যা নির্ভর করে graphical-session.targetএবং আপনার ডেস্কটপে লগ ইন করার সময় সেগুলি পরিষ্কারভাবে চালিত করে।

উদাহরণস্বরূপ @ এমকাইটো ইউনিটটি দেখতে এইরকম হওয়া উচিত:

[ইউনিট]
বর্ণনা = লোহিত সরণ
PartOf = graphical-session.target

[পরিষেবা]
এক্সিকিস্টার্ট = / বিন / রেডশিফ্ট-এল 28: -13 -t 5300: 3300-বি 0.80: 0.91-মি রেন্ডার
পুনর্সূচনা সবসময় =

( daemon-reloadআপনার ইউনিটগুলি সম্পাদনা করার পরে একটি করতে ভুলবেন না !)

  1. আপনার মেশিনটি পুনরায় বুট করুন, লগইন করুন এবং আপনার ইউনিটগুলি প্রত্যাশা অনুযায়ী শুরু করা হবে
।> systemctl - ব্যবহারকারীর স্থিতি গ্রাফিকাল- মূল্যায়ন tar
● গ্রাফিক্যাল- নির্ধারণ.আরগেট - বর্তমান গ্রাফিকাল ব্যবহারকারী সেশন
   লোড করা: লোড করা
   সক্রিয়: ডন থেকে সক্রিয় 2017-01-05 15:08:42 সিইটি; 47 মিনিট আগে
     দস্তাবেজ: মানুষ: systemd.sp विशेष (7)
$> systemctl - ব্যবহারকারীর স্থিতি আপনার ইউনিট ...

ভবিষ্যতের কোনও দিন (এটি কি উবুন্টু হবে 17.04?) সিস্টেমটি graphical-session.targetসঠিকভাবে পরিচালনা করবে বলে আমার কাজটি অচল হয়ে পড়ে । সেদিন কেবল অটোস্টার্ট এবং শাটডাউন স্ক্রিপ্টটি সরিয়ে ফেলুন এবং এটিও xsession.target- আপনার কাস্টম ব্যবহারকারী ইউনিটগুলি ছোঁয়াচে থাকতে পারে এবং কেবল কাজ করতে পারে।


আমি জানি এটি একটি পুরানো মন্তব্য তবে আপনি ওয়ার্কস্পেস> স্টার্টআপ এবং শাটডাউন> অটোস্টার্টের অধীনে সিস্টেম সেটিংস অ্যাপের মাধ্যমে স্টার্টআপ / লগইন স্ক্রিপ্টগুলি যুক্ত করতে পারেন, যদি আপনি এই স্ক্রিপ্টগুলি কোনও জায়গায় রাখতে চান তবে আপনি সেগুলি মনে রাখতে পারেন।
অ্যাম্বিয়েন্টসায়ান

2

এই সমাধানটি প্রশ্নের লেখক যা জিজ্ঞাসা করেছে ঠিক তেমনটাই করে:

এটি Xorg আপ এবং চলমান না হওয়া পর্যন্ত অপেক্ষা করা প্রয়োজন

যদিও এটি করার আরও ভাল উপায় থাকতে পারে, যেমন ইতিমধ্যে অন্যান্য ব্যবহারকারীদের দ্বারা উত্তর দেওয়া হয়েছে, এটি এই সমস্যার আরেকটি উপায় approach

এটি সিস্টেমের সিস্টেমেড-নেটওয়ার্কড-ওয়েট-অনলাইন-সার্ভিসের অনুরূপ যা নির্দিষ্ট মানদণ্ড পূরণ না করা অবধি ব্লক করে। অন্যান্য পরিষেবাগুলি যা এর উপর নির্ভর করে এই পরিষেবাটি সফলভাবে শুরু হওয়ার সাথে সাথে সময়সাপেক্ষে শুরু হবে be

প্রতি ম্যানুয়াল (অধ্যায় "ফাইল"), এক্স সার্ভার হল এমন একটি ইউনিক্স সকেট তৈরি করবে /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


এটি দুর্দান্তভাবে কাজ করে। অতিরিক্ত পরিষেবাটি একটি দুর্দান্ত স্পর্শ। আপনি কেবলমাত্র আপনার টার্গেট পরিষেবায় এক্সেসস্টার্টপ্রে ব্যবহার করতে পারেন। 'প্রস্থান 0' এর আগে আমাকে একটি অতিরিক্ত 'ঘুম 1' যুক্ত করতে হয়েছিল, তবে মনে হচ্ছে ঠিক এক্স চেষ্টা করার চেষ্টা করা এবং এখনই এক্সকে ধরতে এটি খুব দ্রুত ছিল।
টিটিমো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.