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