一時停止から再開時にスクリプトからプログラムを実行する

一時停止から再開時にスクリプトからプログラムを実行する

次の内容の/lib/systemd/system-sleep/ファイルにあるスクリプトを使用して、システムをスリープ状態から再開するときにプログラム RealTimeSync を実行しようとします。RealTimeSync_kill_suspend.sh

#!/bin/sh

case $1 in
        pre)
                echo "$(date) - $1: Killing RealTimeSync" >> /home/bart/Applications/FreeFileSync/suspend_resume.log
                kill -9 `ps -aux | pgrep RealTimeSync`
                exit
                ;;
        post)
                echo "$(date) - $1: Invoking RealTimeSync resume script" >> /home/bart/Applications/FreeFileSync/suspend_resume.log
                sh /home/bart/Applications/FreeFileSync/RealTimeSync_resume.sh
;;
esac

RealTimeSync_resume.sh次の内容のサブスクリプトが実行されることがわかります。

#!/bin/sh

echo "$(date) - Running RealTimeSync" >> /home/bart/Applications/FreeFileSync/suspend_resume.log

/home/bart/Applications/FreeFileSync/RealTimeSync /home/bart/Documents/Documents_backup.ffs_real &

echo "$(date) - RealTimeSync should be running" >> /home/bart/Applications/FreeFileSync/suspend_resume.log

exit

スクリプト内の両方のechoステートメントの後の行とサブスクリプト内のRealTimeSync_kill_suspend.sh両方のステートメントの後の行がログ ファイルにドロップされます。echoRealTimeSync_resume.shsuspend_resume.log

czw, 5 sie 2021, 16:55:50 CEST - pre: Killing RealTimeSync
czw, 5 sie 2021, 16:55:58 CEST - post: Invoking RealTimeSync resume script
czw, 5 sie 2021, 16:55:58 CEST - Running RealTimeSync
czw, 5 sie 2021, 16:56:28 CEST - RealTimeSync should be running

しかし、それを使用してプロセスを検索すると、ps -aux | grep RealTimeSync適切な一致が表示されず、次のようになります。

bart       31262  0.0  0.0  12252  2612 pts/0    S+   17:38   0:00 grep --color=auto RealTimeSync

次のようにサブスクリプトを実行すると、sh /home/bart/Applications/FreeFileSync/RealTimeSync_resume.sh正しいプロセスが実行されますps -aux | grep RealTimeSync:

bart       31066  0.0  0.0    212    68 pts/0    S    17:37   0:00 /home/bart/Applications/FreeFileSync/RealTimeSync /home/bart/Documents/Documents_backup.ffs_real
bart       31071  0.3  0.1 442428 41260 pts/0    Sl   17:37   0:00 /home/bart/Applications/FreeFileSync/Bin/RealTimeSync_x86_64 /home/bart/Documents/Documents_backup.ffs_real
bart       31262  0.0  0.0  12252  2612 pts/0    S+   17:38   0:00 grep --color=auto RealTimeSync

記載されているすべてのファイルには-rwxr-xr-x権限があります。

フォーラムで検索した後、RealTimeSync には、ログオン時にアクティブ化されるが利用できないサービスが必要であるという考えに至りました。たとえば、synclients を起動するスクリプトの実行に問題があった人は、X サーバーに接続する必要がありました。

declare -x DISPLAY=":0.0"
declare -x XAUTHORITY="/home/<your user>/.Xauthority"
synclient VertEdgeScroll=1 VertTwoFingerScroll=1 HorizTwoFingerScroll=1 HorizEdgeScroll=1

このフォーラムスレッドから:https://ubuntuforums.org/showthread.php?t=2380045

どのような助けでもいただければ幸いです。

編集1

「FreeFileSync と ReadTimeSync はグラフィカル X11 ディスプレイにアクセスする必要があるため、システム モードで実行することはできません。ユーザー モードでは、systemd はユーザーのグラフィカル セッションを認識して使用します。」ということがわかりました。そのため、2 つの解決策が考えられます。

上記のいずれか、ハードコーディングDISPLAY、はXAUTHORITY、DISPLAY 値がセッションごとに異なる可能性があるため推奨されません。

または、ディスプレイがユーザー用に初期化されるため、システム サービスではなくユーザー サービスとして実行されます。

ここで見つけたのは、FreeFileSync をシステム サービスとして実行する際の問題のトラブルシューティングです。https://unix.stackexchange.com/questions/529115/system-service-error-unable-to-initialize-gtk-is-display-set-properly

残念ながら、これらのソリューションを実装する際に問題があります。ご協力いただければ幸いです。

編集2

よし、うまくいきました! メイン スクリプトから RealTimeSync を実行していますが、これによって違いが出ることはないと思います。重要なのは、次のように 'DISPLAY' を初期化することです。

#!/bin/sh

case $1 in
        pre)
                echo "$(date) - $1: Killing RealTimeSync" >> /home/bart/Applications/FreeFileSync/suspend_resume.log
                kill -9 `ps -aux | pgrep RealTimeSync`
                exit
                ;;
        post)
                echo "$(date) - Invoking RealTimeSync resume script" >> /home/bart/Applications/FreeFileSync/suspend_resume.log
                env DISPLAY=:1 sudo -u bart /home/bart/Applications/FreeFileSync/RealTimeSync /home/bart/Documents/Documents_backup.ffs_real
;;
esac

このスクリプトの所有者を root に設定します。chown root:root <script_name>

解決策はここからでした:ログインしたユーザー(root ではない)として再開した後、スクリプトを起動します。

私の理解では、これはハードコーディングによって問題が発生する可能性があるため、適切な解決策というよりはむしろ回避策ですDISPLAYが、一時的には機能します。これを root ではなくユーザーとして適切に実行する方法を知っている方がいらっしゃいましたら、ヒントをいただければ幸いです。

関連情報