回復時に実行する systemd サービスの作成

回復時に実行する systemd サービスの作成

私の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

これは非常に魅力的で、必要に応じてモニターの明るさを制御できます。問題は、スリープモードに入った後(ノートブックの端を閉じたときなど)、ノートブックが再起動したときに発生します。上記の最初のスクリプトを手動で実行しないと、明るさ制御は機能しなくなります。/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復元時には空です。だから私の考えでは、睡眠から目覚めたときにスクリプトが早すぎるように見えます。どのようなヒントがありますか?

答え1

これは古い質問であることがわかりますが、次のユニットファイルを使用すると、スリープモードで再起動したときにスクリプトを実行できます。

[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コンピュータがスリープ状態になるときではなく、再開時に実行されるようにすることだと思います。

答え2

ユニットファイルを作成して有効にする代わりに、シェルスクリプト(またはスクリプトへのシンボリックリンク)を/lib/systemd/system-sleep/

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

~からman systemd-suspend.service:

システムサスペンドおよび/または休止状態に入る前に、systemd-suspens.service(および上記の他のデバイス)は/usr/lib/systemd/system-sleep/にあるすべての実行可能ファイルを実行し、2つのパラメータを渡しますします。最初のパラメータは「pre」、2番目のパラメータは選択した操作に応じて「一時停止」、「休止状態」、または「ハイブリッドスリープ」です。システムの一時停止および/または休止状態を終了した直後に同じ実行可能ファイルを実行しますが、最初の引数は「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"

答え3

処理に新しい単位ファイルを使用しない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"
    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"

答え4

記録のみのために:

ルートとして特定のタスクを実行する必要がある場合は、ユーザーも指定する必要があります。
そして、WantedBy=multi-user.targetシステムの起動時に自動的に実行するようにしてください。

StandardOutput=syslog

廃止され、安全に省略できます。
StandardOutput=journal新しいデフォルトです。

以下は、起動時とスタンバイモードに戻ったときに音量をミュートする例です。

[Unit]
Description=Mute Audio on Startup and on resume from standby
After=sleep.target

[Service]
User=root
Type=oneshot
ExecStart=/usr/bin/amixer -D pulse sset Master mute
TimeoutSec=0

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

関連情報