পুনরায় শুরুতে চালিত হওয়ার জন্য একটি সিস্টেমযুক্ত পরিষেবা রচনা


15

আমার ডেল ল্যাপটপ কার্নেল 3.14 এর সাথে এই বাগের সাপেক্ষে । একটি workaround হিসাবে আমি একটি সহজ স্ক্রিপ্ট লিখেছি

/ Usr / bin / উজ্জ্বলতা-ফিক্স:

#!/bin/bash

echo 0 > /sys/class/backlight/intel_backlight/brightnes

(এবং নির্বাহযোগ্য করা chmod +x /usr/bin/brightness-fix:)

এবং একটি সিস্টেমযুক্ত পরিষেবা এটি কল করে যা শুরুতে কার্যকর হয়:

/etc/systemd/system/brightness-fix.service

[Unit]
Description=Fixes intel backlight control with Kernel 3.14

[Service]
Type=forking
ExecStart=/usr/bin/brightness-fix
TimeoutSec=0
StandardOutput=syslog
#RemainAfterExit=yes
#SysVStartPriority=99

[Install]
WantedBy=multi-user.target

এবং সক্ষম: systemctl enable /etc/systemd/system/brightness-fix.service

এটি একটি কবজির মতো কাজ করে এবং আমি আমার প্রদর্শনের উজ্জ্বলতাটিকে যেমন ইচ্ছা তেমন নিয়ন্ত্রণ করতে পারি। স্লিপ মোডে যাওয়ার পরে যখন ল্যাপটপটি পুনরায় শুরু হয় তখন সমস্যাটি আসে (যেমন ল্যাপটপ ঠোঁট বন্ধ করার সময়): আমি উপরে আমার ফিসার্ট স্ক্রিপ্টটি ম্যানুয়ালি না চালিয়েছিলে উজ্জ্বলতা নিয়ন্ত্রণ আর কাজ করে না:/usr/bin/brightness-fix

পুনরায় সার্বক্ষণিক সময়ে কার্যকর করার জন্য আমি কীভাবে আমার মতো আরও একটি সিস্টেমযুক্ত পরিষেবা তৈরি করতে পারি?

সম্পাদনা: নীচের মতামত অনুসারে আমি আমার brightness-fix.serviceএই মত পরিবর্তন করেছি :

[Unit]
Description=Fixes intel backlight control with Kernel 3.14

[Service]
Type=oneshot
ExecStart=/usr/local/bin/brightness-fix
TimeoutSec=0
StandardOutput=syslog

[Install]
WantedBy=multi-user.target sleep.target

এছাড়াও echo "$1 $2" > /home/luca/br.logএটি আমার সম্পাদিত হয়েছে কিনা তা যাচাই করতে আমি আমার স্ক্রিপ্টে যুক্ত করেছি। এটি আসলে স্ক্রিপ্টটি পুনরায় শুরুতেও কার্যকর করা হয় ( post suspend) তবে এর কোনও প্রভাব নেই (ব্যাকলিট 100% এবং পরিবর্তন করা যায় না)। আমি লগিং করার চেষ্টা করেছি $DISPLAYএবং $USERএবং পুনরায় শুরু করার সময়, তারা খালি। সুতরাং আমার অনুমান যে ঘুম থেকে জেগে উঠলে স্ক্রিপ্টটি খুব তাড়াতাড়ি কার্যকর করা হয়। কোন ইঙ্গিত?


2
WantedBy=sleep.target...
জেসনওয়ারিয়ান

সত্যি ?! এত সহজ ?! :) আমি কি উপরে আমার স্ক্রিপ্টে 'ঘুম.আরগেট' যুক্ত করতে পারি বা আমি কি এর জন্য একটি নতুন ডেডিকেটেড সিস্টেমড সার্ভিস স্ক্রিপ্ট তৈরি করব?
lviggiani

... ডকুমেন্টেশন অনুসারে "এই বিকল্পটি একাধিকবার ব্যবহৃত হতে পারে, বা ইউনিটের নামগুলির একটি স্থান-বিভাজিত তালিকা দেওয়া যেতে পারে"। আমি এখন চেষ্টা করব।
lviggiani

আপনি আবশ্যক আপনার বিদ্যমান systemd হল সেবা ফাইল থেকে এটি যোগ (যা, উপায় দ্বারা, হয় না একটি স্ক্রিপ্ট এটা স্থায়ী কনফিগারেশনের ফাইল)। এবং একটি পার্শ্ব নোট হিসাবে ফাইলসাইম হায়ারার্কি স্ট্যান্ডার্ড উল্লেখ করে যে আপনি নিজের দ্বারা লিখিত স্ক্রিপ্টগুলি রাখার উপযুক্ত জায়গা /usr/local/bin, তা নয় /usr/bin। এই ডিরেক্টরিটি কেবল প্যাকেজ পরিচালকের জন্য সংরক্ষিত।
strugee

2
আমি বিশ্বাস করি sleep.targetকম্পিউটারটি যখন পুনরায় চালু হয় তার চেয়ে বরং ঘুমায় যখন ইউনিটটি চালাবে তখন using একটি ইউনিট ফাইলের জন্য আমার উত্তরটি নীচে দেখুন যা একই ধরণের সমস্যার সাথে আমার জন্য কাজ করেছে।
jat255

উত্তর:


18

আমি জানি এটি একটি পুরানো প্রশ্ন, তবে নীচের ইউনিট ফাইলটি ঘুম থেকে পুনরায় শুরু করার পরে আমার জন্য স্ক্রিপ্ট চালানোর জন্য কাজ করেছিল:

[Unit]
Description=<your description>
After=suspend.target

[Service]
User=root
Type=oneshot
ExecStart=<your script here>
TimeoutSec=0
StandardOutput=syslog

[Install]
WantedBy=suspend.target

আমি বিশ্বাস করি After=suspend.targetকম্পিউটারটি ঘুমাতে যাওয়ার পরিবর্তে এটিই এটিকে পুনরায় চালু করে।


4
সঙ্গে কাজ করে After=suspend.targetইউনিট এবং WantedBy=multi-user.target sleep.targetমধ্যে ইনস্টল
ইমমানুয়েল

আমি এখানে উবুন্টু 16.04 (প্রাথমিক লোকি) তে সফলভাবে নিম্নলিখিত ইউনিটগুলি ব্যবহার করছি ।
নাফটুলি কে

7

ইউনিট ফাইলটি লেখার এবং সক্ষম করার বিকল্প হিসাবে আপনি এতে একটি শেল স্ক্রিপ্ট (বা আপনার স্ক্রিপ্টের একটি সিএমলিংক) রাখতে পারেন /lib/systemd/system-sleep/

এটি ঘুম / হাইবারনেটের আগে এবং পুনরায় শুরু করার আগে ডাকা হবে।

থেকে man systemd-suspend.service:

সিস্টেম সাসপেন্ড এবং / অথবা হাইবারনেশন সিস্টেমড-সাসপেন্ড.সওয়ারিস প্রবেশের পূর্বেই (এবং অন্যান্য উল্লিখিত ইউনিট যথাক্রমে) / usr / lib / systemd / system-ঘুম / তে সমস্ত এক্সিকিউটেবল চালাবে এবং তাদের কাছে দুটি আর্গুমেন্ট প্রেরণ করবে। প্রথম যুক্তিটি হবে "প্রাক", দ্বিতীয়টি হয় "স্থগিত", "হাইবারনেট", বা নির্বাচিত ক্রিয়াটির উপর নির্ভর করে "হাইব্রিড-স্লিপ"। সিস্টেম স্থগিতকরণ এবং / বা হাইবারনেশন ছাড়ার সাথে সাথে একই নির্বাহী চালিত হয় তবে প্রথম যুক্তিটি এখন "পোস্ট"। এই ডিরেক্টরিতে সমস্ত এক্সিকিউটেবল সমান্তরালভাবে কার্যকর করা হয় এবং সমস্ত এক্সিকিউটেবল শেষ না করা পর্যন্ত ক্রিয়াকলাপ কার্যকর করা চলবে না।

এটি দিয়ে এটি পরীক্ষা করুন:

#!/bin/sh
## This file (or a link to it) must be in /lib/systemd/system-sleep/

logger -t "test" "\$0=$0, \$1=$1, \$2=$2"

আপনি যে লিঙ্কটি পৃষ্ঠাটি লিঙ্ক করেছেন তাতে একটি ফাইলের উল্লেখ রয়েছে /usr/libতবে আপনার সমস্ত উদাহরণের মধ্যে ফাইলগুলি উল্লেখ করা হয়েছে/lib
qdii

@ কিডিআই: এটি বিতরণ এবং / বা সংস্করণের উপর নির্ভর করতে পারে। ডেবিয়ান 8 জেসি এবং উবুন্টু 16.04 এ system-sleepডিরেক্টরিটি উপস্থিত রয়েছে বলে মনে হয় /lib/systemd/এবং /usr/lib/systemdএতে অন্যান্য স্টাফ রয়েছে।
mivk

1

মিভকের উত্তরের অনুসরণ, যাতে আমি একটি নতুন ইউনিট ফাইলের সাথে কৌতুক এড়ানোর চেষ্টা করি (আমার প্রশ্ন এখানে দেখুন ল্যাপটপের idাকনা ইভেন্টগুলিতে কীভাবে প্রতিক্রিয়া জানানো যায়? )। এখানে আমার সমাধান; এটি 100% সোজা ( দীর্ঘশ্বাস ) নয় কারণ ঘুম থেকে বেরিয়ে আসার সময় সিস্টেমটি স্থিতিশীল হয় না:

আমার ফেডোরা 26 বাক্সে আমি এখানে একটি সিমিলিংক রেখেছি: /usr/lib/systemd/system-sleep/sleepyheadযা এখানে নির্দেশ করে: /root/bin/sleepyheadএতে রয়েছে:

#!/bin/sh
## This file (or a link to it) must be in /lib/systemd/system-sleep/

# This is called when the lid is closed, as follows:
# $0=/usr/lib/systemd/system-sleep/sleepyhead, $1=pre, $2=suspend
# ...and when the lid is opened, as follows:
# $0=/usr/lib/systemd/system-sleep/sleepyhead, $1=post, $2=suspend


touch /tmp/sleepyrun
logger -t "sleepyhead" "Start: \$1=$1, \$2=$2"
if [ "$1" = "post" ] ; then
    action="RUN trackpoint in background"
    bash /root/bin/trackpoint >/tmp/trackpoint-run 2>&1
else
    action="NO ACTION"
fi
logger -t "sleepyhead" "${action}: " "\$1=$1, \$2=$2"

/root/bin/trackpointস্ক্রিপ্ট অনুসরণ করে। মনে রাখবেন যে প্রথম ঘুমটি সমালোচনামূলক। Idাকনাটি খোলার সাথে সাথেই ডিভাইসটি সেট আপ করা হয়, তাই এটি প্রথমে বিদ্যমান নেই। যদি আমি ঘুম ছাড়া অন্য কিছু করার চেষ্টা করি তবে "স্লিপহেড" স্ক্রিপ্টটি প্রস্থান করতে সত্যিই দীর্ঘ সময় নেয় এবং আমার পয়েন্টারটি কমপক্ষে 60 সেকেন্ডের জন্য হিমায়িত হবে। তদ্ব্যতীত, নোট করুন যে আপনি /root/bin/trackpointস্ক্রিপ্টটি sleepyheadউপরে, পটভূমিতে রাখতে পারবেন না । যদি আপনি এটি করেন, sleepyheadপ্রস্থানটি বের হয়ে গেলে হত্যা করা হবে ।

#!/bin/bash
# This is /root/bin/trackpoint

echo "Start $0"
date

found=false
dir=""
# dirlist can look like:
# /sys/devices/platform/i8042/serio1/serio25/speed
# /sys/devices/platform/i8042/serio1/serio24/speed
# ...the older one appears to get cleaned a little later.

sleep 1 # If I don't put this in here, my pointer locks up for a really long time...
for i in 1 2 3 4; do
    speedfiles=$(find /sys/devices/platform/i8042 -name speed) # There may be multiple speed files at this point.
    [ -z "$speedfiles" ] && { sleep 1; continue; }
    dirlist=$(dirname $speedfiles)
    printf "Speed file(s) at $(find /sys/devices/platform/i8042 -name speed | tail -1) \n"
    # All this remaking of the path is here because the filenames change with
    # every resume, and what's bigger: 9 or 10? ...Depends if you're
    # lexicographical or numerical. We need to always be numerical.
    largest_number="$(echo $dirlist | tr ' ' '\n' | sed -e 's/.*serio//' | sort -n | tail -1)"
    dir="$(echo $dirlist | tr ' ' '\n' | egrep serio${largest_number}\$ )"
    echo "Dir is $dir number is $largest_number" 
    [ -n "$dir" ] && found=true && break
done
$found || exit 1


date
echo -n 4 > $dir/inertia
echo -n 220 > $dir/sensitivity
echo -n 128 > $dir/speed
date
echo "Done $0"

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