Özgeçmişte yürütülecek bir systemd hizmeti yazma


15

Dell dizüstü bilgisayarım çekirdek 3.14 ile bu hataya tabidir . Geçici bir çözüm olarak basit bir senaryo yazdım

/ Usr / bin / parlaklık düzeltme:

#!/bin/bash

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

(ve çalıştırılabilir yapılan: chmod +x /usr/bin/brightness-fix)

ve başlangıçta yürütülen bir sistem hizmetini çağırır:

/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

ve etkin: systemctl enable /etc/systemd/system/brightness-fix.service

Bu bir cazibe gibi çalışıyor ve ekran parlaklığımı istediğim gibi kontrol edebiliyorum. Sorun, dizüstü bilgisayar uyku moduna geçtikten sonra devam ettiğinde (örneğin dizüstü bilgisayar dudağını kapatırken) gelir: yukarıdaki fisrt betiğimi manuel olarak yürütmediğim sürece parlaklık kontrolü artık çalışmıyor:/usr/bin/brightness-fix

Özgeçmiş zamanında yürütülecek yukarıdaki benimki gibi başka bir systemd hizmeti nasıl oluşturabilirim?

EDIT: Aşağıdaki yorumlara göre ben böyle değiştirdim 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

Ayrıca echo "$1 $2" > /home/luca/br.loggerçekten yürütülmüş olup olmadığını kontrol etmek için benim komut dosyası ekledim . Aslında resume ( post suspend) de çalıştırılan script'in etkisi yoktur (arkadan aydınlatma% 100'dür ve değiştirilemez). Ayrıca günlüğe kaydetmeyi denedim $DISPLAYve $USERözgeçmişinde boşlar. Benim tahminim uykudan uyandığında senaryo çok erken yürütülüyor. İpucu var mı?


2
WantedBy=sleep.target...
jasonwryan

Gerçekten mi?! Bu kadar basit mi ?! :) Yukarıdaki komut dosyasına 'sleep.target' ekleyebilir miyim yoksa bunun için yeni bir ayrılmış systemd hizmet betiği mi oluşturabilirim?
lviggiani

... belgelere göre "Bu seçenek bir kereden fazla kullanılabilir veya boşlukla ayrılmış bir birim ad listesi verilebilir". Şimdi deneyeceğim.
lviggiani

Eğer gerekir Mevcut systemd servis dosyasına eklemek (bu arada, olduğunu değil bir senaryosu; statik bir yapılandırma dosyası var). ve bir yan not olarak, Dosya Sistemi Hiyerarşi Standardı /usr/local/bin, kendi yazdığınız komut dosyalarını koymak için uygun yerin değil olduğunu belirtir /usr/bin. bu dizin yalnızca paket yöneticisi için ayrılmıştır.
14'te strugee

2
sleep.targetBilgisayarın uyku durumunda kaldığı yerden değil, üniteyi kullanacağına inanıyorum . Benzer bir sorunla benim için çalışan bir birim dosyası için aşağıdaki cevabımı görün.
jat255

Yanıtlar:


18

Bu eski bir soru olduğunu biliyorum, ancak aşağıdaki birim dosyası uyku modundan devam üzerine bir komut dosyası çalıştırmak için çalıştı:

[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.targetBilgisayarın uykuya geçmesinden ziyade özgeçmişte çalışmasını sağlayan olduğuna inanıyorum .


4
İle çalışır After=suspend.target içinde Birimi ve WantedBy=multi-user.target sleep.targetiçinde monte edin .
Emmanuel

Aşağıdaki birimleri burada Ubuntu 16.04 (temel Loki) üzerinde başarıyla kullanıyorum .
Naftuli Kay

7

Bir birim dosyası yazmaya ve etkinleştirmeye alternatif olarak, içine bir kabuk betiği (veya betiğinize bir sembolik bağlantı) da ekleyebilirsiniz /lib/systemd/system-sleep/.

Uyku / hazırda bekletme modundan önce ve devam zamanında çağrılır.

Gönderen man systemd-suspend.service:

Sistem askıya alma ve / veya hazırda bekletme moduna girmeden hemen önce systemd-suspend.service (ve sırasıyla diğer bahsedilen birimler) / usr / lib / systemd / system-sleep / içindeki tüm yürütülebilir dosyaları çalıştırır ve bunlara iki argüman iletir. İlk argüman "ön", ikincisi seçilen işleme bağlı olarak "askıya alma", "hazırda bekletme" veya "karma uyku" olacaktır. Sistem askıya alma ve / veya hazırda bekletme modundan çıktıktan hemen sonra aynı yürütülebilir dosyalar çalıştırılır, ancak ilk argüman şimdi "gönder" dir. Bu dizindeki tüm yürütülebilir dosyalar paralel olarak yürütülür ve tüm yürütülebilir dosyalar bitinceye kadar eylemin yürütülmesine devam edilmez.

Şununla test edin:

#!/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
Bağladığınız

@ qdii: dağıtım ve / veya sürüme bağlı olabilir. Debian 8 Jessie ve Ubuntu 16.04'te, system-sleepdizin içeride gibi görünür /lib/systemd/ve /usr/lib/systemdbaşka şeyler içerir.
mivk

1

Mivk'ün cevabını takip ederek yeni bir birim dosyasıyla mucking yapmaktan kaçınıyorum (buradaki soruma bakın Dizüstü bilgisayar kapağı olaylarına nasıl tepki verilir? ). İşte benim çözümüm; % 100 basit değildir ( iç çeker ) çünkü sistem uykudan çıktığında kararlı değildir:

Benim Fedora 26 kutusunda Burada bir sembolik koyun: /usr/lib/systemd/system-sleep/sleepyheadBurada hangi noktaları: /root/bin/sleepyhead, içeren:

#!/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/trackpointKomut izler. İlk uykunun kritik olduğunu unutmayın. Cihaz, kapak her açıldığında kurulur, bu nedenle ilk başta mevcut değildir. Uyku dışında bir şey yapmaya çalışırsam, "sleepyhead" betiğinin çıkması çok uzun zaman alır ve işaretçim en az 60 saniye boyunca donar. Ayrıca, /root/bin/trackpointbetiği sleepyheadyukarıdaki arka plana koyamayacağınızı unutmayın. Bunu yaparsanız, çıkış yapıldığında süreç öldürülecektir 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"

Çok güzel organize edilmiş ve belgelenmiş. Yapabilseydim sana çok oy verirdim!
MountainX
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.