再開時に実行されるsystemdサービスの作成


15

私のDellラップトップはカーネル3.14でこのバグの影響を受けます。回避策として、簡単なスクリプトを書きました

/ usr / bin / brightness-fix:

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

本当に?!それはとても簡単ですか?!:)上記のスクリプトに「sleep.target」を追加できますか、それ専用の新しいsystemdサービススクリプトを作成しますか?
lviggiani 14

...ドキュメントによると、「このオプションは複数回使用するか、スペースで区切られたユニット名のリストを指定することができます」。今からやってみます。
lviggiani 14

既存のsystemdサービスファイルに追加する必要あります(ちなみに、これはスクリプトではなく、静的な構成ファイルです)。また、サイドノートとして、Filesystem Hierarchy Standardでは、自分で書いたスクリプトを配置する適切な場所はであると述べて/usr/local/bin/usr/binます。そのディレクトリは、パッケージマネージャ専用です。
strugee

2
を使用するsleep.targetと、コンピューターが再開するときではなく、コンピューターがスリープするときにユニットが実行されます。同様の問題で私のために働いたユニットファイルについては、以下の私の答えを参照してください。
jat255

回答:


17

これは古い質問であることはわかっていますが、次のユニットファイルは、スリープからの再開時にスクリプトを実行するのに役立ちました。

[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(エレメンタリーLoki)で次のユニットを正常に使用しています
ナフトゥリケイ

7

ユニットファイルを記述して有効にする代わりに、シェルスクリプト(またはスクリプトへのシンボリックリンク)をに入れることもできます/lib/systemd/system-sleep/

スリープ/休止状態の前、および再開時に呼び出されます。

からman systemd-suspend.service

システムのサスペンドおよび/または休止状態に入る直前に、systemd-suspend.service(およびそれぞれ他の言及されたユニット)は/ usr / lib / systemd / system-sleep /内のすべての実行可能ファイルを実行し、2つの引数を渡します。最初の引数は「pre」で、2番目は選択したアクションに応じて「suspend」、「hibernate」、または「hybrid-sleep」です。システムのサスペンドやハイバネーションを終了した直後に、同じ実行可能ファイルが実行されますが、最初の引数は「post」になりました。このディレクトリ内のすべての実行可能ファイルは並行して実行され、すべての実行可能ファイルが終了するまでアクションの実行は継続されません。

これでテストしてください:

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

あなたがリンクするmanページはに置かれたファイルに言及し/usr/libたが、すべての例は以下のファイルを参照してください/lib
QDII

@qdii:ディストリビューションやバージョンに依存する場合があります。Debian 8 JessieおよびUbuntu 16.04では、system-sleepディレクトリはにあるように見え/lib/systemd//usr/lib/systemd他のものが含まれています。
mivk

1

mivkの答えのフォローアップです。新しいユニットファイルをいじるのを避けています(ラップトップのふたのイベントにどのように対応するのですか?)。これが私の解決策です。100%簡単ではありません(ため息)。これは、システムがスリープ状態から抜け出すと安定しないためです。

私のFedora 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-for-Monica
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.