재개시 실행할 시스템 서비스 작성


15

내 Dell 랩탑 에는 커널 3.14 의이 버그가 있습니다. 해결 방법으로 간단한 스크립트를 작성했습니다.

/ 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

그것은 매력처럼 작동하며 원하는대로 디스플레이 밝기를 제어 할 수 있습니다. 절전 모드로 전환 한 후 랩톱이 다시 시작되면 (예 : 랩톱 립을 닫을 때) 문제가 발생합니다. 위의 fisrt 스크립트를 수동으로 실행하지 않으면 밝기 제어가 더 이상 작동하지 않습니다./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...
jasonwryan

정말?! 그렇게 간단합니까?! :) 위의 스크립트에 'sleep.target'을 추가 할 수 있습니까, 아니면 새로운 전용 시스템 서비스 스크립트를 작성해야합니까?
lviggiani

... 문서에 따르면 "이 옵션은 두 번 이상 사용되거나 공백으로 구분 된 단위 이름 목록이 제공 될 수 있습니다". 이제해볼 게요
lviggiani

당신은 해야한다 기존 systemd 서비스 파일에 추가 (그런데,이다, 하지 스크립트, 그것은 정적 구성 파일입니다). 및 보조 노트로, Filesystem Hierarchy Standard에 적절한 장소가 자신이 쓴 스크립트를 넣어한다고 /usr/local/bin,하지 /usr/bin. 해당 디렉토리는 패키지 관리자 전용입니다.
strugee

2
sleep.target컴퓨터를 재개 할 때가 아니라 컴퓨터가 절전 모드 일 때이 장치를 사용한다고 생각 합니다. 비슷한 문제로 저에게 도움이 된 단위 파일에 대해서는 아래 답변을 참조하십시오.
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설치합니다 .
Emmanuel

우분투 16.04 (초등 Loki) 에서 다음 단위를 성공적으로 사용 하고 있습니다.
Naftuli Kay

7

단위 파일을 작성하고 활성화하는 대신 쉘 스크립트 (또는 스크립트에 대한 심볼릭 링크)를에 넣을 수도 /lib/systemd/system-sleep/있습니다.

절전 / 최대 절전 모드 전 및 재개시 호출됩니다.

보낸 사람 man systemd-suspend.service:

시스템 일시 중단 및 / 또는 최대 절전 모드로 들어가기 직전에 systemd-suspend.service (및 기타 언급 된 장치)는 / usr / lib / systemd / system-sleep /에서 모든 실행 파일을 실행하고 두 개의 인수를 전달합니다. 첫 번째 인수는 "pre"이고 두 번째 인수는 선택한 작업에 따라 "suspend", "hibernate"또는 "hybrid-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

@qdii : 배포판 및 / 또는 버전에 따라 달라질 수 있습니다. 데비안 8 제시하고 우분투 16.04에서 system-sleep디렉토리에있는 것으로 보인다 /lib/systemd/, 그리고 /usr/lib/systemd다른 재료가 포함되어 있습니다.
mivk

1

새로운 단위 파일로 방해하지 않는 mivk의 대답에 대한 후속 조치 ( 노트북 뚜껑 이벤트에 반응하는 방법은 여기에서 내 질문 참조 ). 여기 내 해결책이 있습니다. 수면에서 나올 때 시스템이 안정적이지 않기 때문에 100 % 간단하지 않습니다 ( sigh ).

내 페도라 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스크립트는 다음과 같습니다. 첫 수면이 중요합니다. 장치는 뚜껑을 열 때마다 설치되므로 처음에는 존재하지 않습니다. 절전 모드 이외의 작업을 수행하려고하면 "sleepyhead"스크립트를 종료하는 데 시간이 오래 걸리고 포인터가 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.