Запуск программы из скрипта при выходе из режима ожидания

Запуск программы из скрипта при выходе из режима ожидания

Я пытаюсь запустить программу RealTimeSync при выходе системы из спящего режима, используя скрипт, расположенный в /lib/systemd/system-sleep/файле 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скрипте и строки после обоих echoоператоров в RealTimeSync_resume.shподскрипте в файл журнала suspend_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

Когда я запускаю sub-script с помощью, 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, буду благодарен за любые подсказки.

Связанный контент