systemdが起動した後にユーザースクリプトを実行する方法は?

systemdが起動した後にユーザースクリプトを実行する方法は?

私のDebian Jessieデスクトップボックスがスリープモードから目覚めたとき(新しいShiny systemdを介して)、私のマウス設定はデフォルトに戻り、私のカスタム設定はリセットされます。

xinput set-prop 12 'Device Accel Constant Deceleration' 2.5

ログインすると実行されます。

覚醒時にランダムなユーザースクリプトを実行するには?(ユーザーがXセッションの所有者であると仮定)

私が知る限り、以下は私が設定に適用した唯一のカスタマイズです。systemd(はい、任意のユーザーには機能しないため、これは完全に間違っていることを知っていますが、まだ実行方法を見つけることができませんでした...これは多少関連しています)

また、現在のXスクリーンを使用しているユーザーとして目覚める前に、任意のユーザースクリプトをどのように実行しますか?

cat /etc/systemd/system/i3lock.service

#systemctl enable i3lock.service

[Unit]
Description=i3lock
Before=sleep.target

[Service]
User=fommil
Type=forking
Environment=DISPLAY=:0
ExecStart=/usr/bin/i3lock -c 000000

[Install]
WantedBy=sleep.target

答え1

この回答は以下に基づいています。askubuntu.com/a/661747/394818(またコメント寄稿者: @sun-bear),askubuntu.com/q/616272/394818そしてsuperuser.com/a/1269158/585953

システムサービスの使用:

ファイルの作成/etc/systemd/system/my_user_script.service:

[Unit]
Description=Run my_user_script
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target


[Service]
ExecStart=/path/to/my_user_script
#User=my_user_name
#Environment=DISPLAY=:0

[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

サービスが特定の種類のスリープモードから復帰した後にのみ実行できる場合は、一時停止/休止状態/ハイブリッドを削除します。特定のユーザーがサービスを実行する必要がある場合は、User=行のコメントを外して関連するEnvironment=ユーザー名を変更してください。

次のコマンドを使用してサービスファイルをインストールします。

sudo systemctl enable my_user_script

ユーザーサービスを使用すると機能しません。

User=次のようにハードコードされたユーザー名を~/.config/systemd/user/my_user_script.service設定したくない場合

systemctl --user enable my_user_script

しかし、これはうまくいきません。 @grawityで詳しく説明します。unix.stackexchange.com/a/174837/163108なぜこれが起こるのか:

sleep.targetシステムサービス専用です。その理由は、sleep.target寝ている間に自動的に活性化される魔法の対象ではないからだ。これは普通の目標です。フットオプションシステムは省電力モードに切り替わります。したがって、「ユーザー」インスタンスには同等のインスタンスはありません。 (残念ながら、「ユーザー」インスタンスは現在システム全体のサービスに依存できません。)

答え2

ファイルを作成しました/lib/systemd/system-sleep/(たとえばと呼ぶことができますwakeup)。

#!/bin/sh
case $1 in
  post)
    /bin/runme
  ;;
esac

その後、実行権限ビットを設定しました。

# chmod +x /usr/lib/systemd/system-sleep/wakeup

起こったときに呼び出されましたpost

詳細については、以下を確認してください。ここ

答え3

システム単位のファイルを作成することもできます。

# /etc/sysstemd/system/awake.service
# ExecStart is executed on wake up from 'sleep' (suspend or hibernate).
[Unit]
WantedBy=sleep.target
After=systemd-suspend.service systemd-hybrid-sleep.service systemd-hibernate.service

[Service]
Type=simple
ExecStart=/bin/bash -c 'echo awake from sleep' >> /tmp/awake.notes'

通常、これはsystemdサービスを再起動するために使用されます。

ExecStart=/bin/systemctl restart fancontrol

答え4

以前のすべてのソリューションは、実際にリリースできる方法を提供していませんでした。ユーザー覚醒後のユニット。環境変数をそこにインポートしたので、ユーザー単位を使用したい場合があります(例:を使用してdbus-update-activation-environment --all --systemd)。

私はこの問題に対してユーザーサービスを開始するシステムサービスを作成することに関連する醜い解決策を見つけることができました。

システムサービスの作成:/etc/systemd/system/[email protected]

[Unit]
Description=Run user unit of %i after wakeup.
After=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl --user --machine=%i@ start --wait afterwakeup.service

[Install]
WantedBy=suspend.target hibernate.target hybrid-sleep.target suspend-then-hibernate.target

からインスピレーションを受けるhttps://unix.stackexchange.com/a/713646/454143

そしてユーザー単位~/.config/systemd/user/afterwakeup.service

[Unit]
Description=Runs after wakeup from suspend etc.

[Service]
ExecStart=<do anything you want here, dont forget to import your environment>
Type=oneshot

今すぐ実行してください。たとえば、.xinitrc()systemctl enable afterwakeup@<youruser>.serviceからユーザーエクスペリエンスを取得することを忘れないでください。dbus-update-activation-environment --all --systemd

関連情報