रिज्यूम में निष्पादित होने के लिए एक सिस्टमड सर्विस लिखना


15

मेरा डेल लैपटॉप कर्नेल 3.14 के साथ इस बग के अधीन है । वर्कअराउंड के रूप में मैंने एक साधारण स्क्रिप्ट लिखी

/ Usr / bin / चमक ठीक:

#!/bin/bash

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

(और निष्पादन योग्य बनाया: chmod +x /usr/bin/brightness-fix)

और एक systemd सेवा इसे कॉल करती है जिसे स्टार्टअप पर निष्पादित किया जाता है:

/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

यह एक आकर्षण की तरह काम करता है और मैं अपनी डिस्प्ले ब्राइटनेस को नियंत्रित कर सकता हूं। समस्या तब आती है जब लैपटॉप स्लीप मोड में जाने के बाद फिर से शुरू होता है (जैसे लैपटॉप लेप को बंद करते समय): चमक नियंत्रण तब तक काम नहीं करता है जब तक कि मैं ऊपर दिए गए मेरे fisrt स्क्रिप्ट को मैन्युअल रूप से निष्पादित नहीं करता हूं:/usr/bin/brightness-fix

मैं फिर से शुरू समय पर निष्पादित करने के लिए ऊपर की तरह एक और systemd सेवा कैसे बना सकता हूं?

संपादित करें: नीचे दी गई टिप्पणियों के अनुसार मैंने अपना संशोधन 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...
जसोनव्रीयन

वास्तव में?! यह इतना आसान है ?! :) क्या मैं ऊपर अपनी स्क्रिप्ट में 'sleep.target' जोड़ सकता हूं या मैं इसके लिए एक नई समर्पित सिस्टमड सर्विस स्क्रिप्ट बनाऊंगा?
lviggiani

... प्रलेखन के अनुसार "इस विकल्प का एक से अधिक बार उपयोग किया जा सकता है, या इकाई नामों की एक अंतरिक्ष-पृथक सूची दी जा सकती है"। मैं अब कोशिश कर रहा हूँ।
lviggiani

आपको इसे अपनी मौजूदा सिस्टमड सर्विस फ़ाइल में जोड़ना होगा (जो, वैसे, स्क्रिप्ट नहीं है; यह एक स्थिर कॉन्फ़िगरेशन फ़ाइल है)। और एक साइड नोट के रूप में, फाइलसिस्टम पदानुक्रम मानक बताता है कि आपके द्वारा लिखी गई लिपियों को रखने के लिए उचित स्थान है /usr/local/bin, नहीं /usr/bin। वह निर्देशिका केवल संकुल प्रबंधक के लिए आरक्षित है।
स्ट्रॉन्ग

2
मेरा मानना ​​है कि sleep.targetजब कंप्यूटर फिर से शुरू होगा, तब इकाई के उपयोग से ही कंप्यूटर चलेगा। एक समान फ़ाइल के साथ काम करने वाली इकाई फ़ाइल के लिए नीचे मेरा उत्तर देखें।
1525 पर 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में स्थापित करें
इमैनुएल

मैं यहाँ Ubuntu 16.04 (प्राथमिक लोकी) पर निम्नलिखित इकाइयों का सफलतापूर्वक उपयोग कर रहा हूँ ।
Naftuli Kay

7

एक इकाई फ़ाइल को लिखने और सक्षम करने के विकल्प के रूप में, आप एक शेल स्क्रिप्ट (या अपनी स्क्रिप्ट के लिए एक सिमलिंक) भी डाल सकते हैं /lib/systemd/system-sleep/

इसे सोने / हाइबरनेट करने से पहले और फिर से शुरू करने के समय पर बुलाया जाएगा।

से man systemd-suspend.service:

सिस्टम सस्पेंड और / या हाइबरनेशन systemd-suspend.service (और क्रमशः अन्य उल्लिखित इकाइयाँ) दर्ज करने से तुरंत पहले, सभी निष्पादक / usr / lib / systemd / system-sleep / चलाएंगे और उनके लिए दो तर्क पारित करेंगे। पहला तर्क "पूर्व" होगा, दूसरा या तो "सस्पेंड", "हाइबरनेट", या "हाइब्रिड-स्लीप" चुने गए एक्शन के आधार पर होगा। सिस्टम सस्पेंड और / या हाइबरनेशन छोड़ने के तुरंत बाद समान निष्पादक चलाए जाते हैं, लेकिन पहला तर्क अब "पोस्ट" है। इस निर्देशिका में सभी निष्पादनों को समानांतर में निष्पादित किया जाता है, और सभी निष्पादनयोग्य समाप्त होने तक कार्रवाई का निष्पादन जारी नहीं होता है।

इसे इसके साथ टेस्ट करें:

#!/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

फॉलोअप टू मिवक का जवाब, जिसमें मैं एक नई यूनिट फ़ाइल के साथ मैकिंग करने से बचता हूं (मेरा सवाल यहां देखें ) लैपटॉप ढक्कन घटनाओं पर कैसे प्रतिक्रिया दें? )। यहाँ मेरा समाधान है; यह 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स्क्रिप्ट इस प्रकार है। ध्यान दें कि पहली नींद महत्वपूर्ण है। डिवाइस को हर बार ढक्कन खोले जाने पर सेट किया जाता है, इसलिए यह पहले से मौजूद नहीं है। अगर मैं कुछ भी करने की कोशिश करता हूं, लेकिन नींद आती है, तो "स्लीपहेड" स्क्रिप्ट को बाहर निकलने के लिए वास्तव में लंबा समय लगता है और मेरा सूचक कम से कम 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"

बहुत अच्छी तरह से संगठित और प्रलेखित। अगर मैं कर सकता तो मैं आपको कई वोट देता!
MountainX
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.