LINUX.ORG.RU
ФорумTalks

Организовать запуск приложений через systemd

 , ,


0

2

Есть windows manager(dwm). Все приложения при старте запускаются через autostart.sh так:

PROFILE_USER_HOME='/home/user_nixos'
source /etc/PROFILE

RUN_PATH="/${HOME}/.dwm/scripts/startup/client"

# exit if another instance of this script is running
if [[ `pgrep -f $0` != "$$" ]]; then
        echo "Exiting ! Exist"
        exit
fi

# run client scripts
for file in `ls -v $RUN_PATH`; do
    # [ -f "${RUN_PATH}/$file" ] && [ -x "${RUN_PATH}/$file" ] && bash -c "${RUN_PATH}/$file  2>/dev/null &"
    [ -f "${RUN_PATH}/$file" ] && [ -x "${RUN_PATH}/$file" ] && sudo -u ${USER} bash -c "${RUN_PATH}/$file  2>/dev/null &"
done

ls -1 ~/.dwm/scripts/startup/client

01_common.sh
02_idle_shutdown.sh
03_redshift.sh
04_xscreensaver.sh
05_xset.sh
06_xmodmap.sh
100_browser.sh
10_imwheel.sh
120_numlock.sh
121_keyboard.sh
122_touchpad.sh
130_deluge.sh
140_vim.sh
150_telegram.sh
170_mc.sh
180_unclutter.sh
190_monitoring.sh
20_kbdd.sh
30_keepassx.sh
40_terminal.sh
70_skype.sh
80_thunar.sh
998_autocutsel.sh
999_laptop.sh

cat ~/.dwm/scripts/startup/client/01_common.sh

#!/usr/bin/env bash
# set -x

if [[ -x "$(command -v dbus-update-activation-environment)" ]]; then
    dbus-update-activation-environment --systemd DBUS_SESSION_BUS_ADDRESS DISPLAY XAUTHORITY
fi

# load resources
if [[ -x "$(command -v xrdb)" ]]; then
    [[ -f ~/.Xresources ]] && xrdb -load ~/.Xresources;xrdb -merge ~/.Xresources
fi

# set background black color
if [[ -x "$(command -v xsetroot)" ]]; then
    # echo aaa > /home/user_nixos/xsetroot.txt
    xsetroot -bg "#242424" 2>/dev/null &
fi

# set cursor name
if [[ -x "$(command -v xsetroot)" ]]; then
    xsetroot -cursor_name left_ptr 2>/dev/null &
fi

# set wmname
if [[ -x "$(command -v wmname)" ]]; then
    wmname LG3D &
fi

if [[ -x "$(command -v hsetroot)" ]]; then
    hsetroot -solid "#242424" &
fi

# start notification daemon
if [[ -f /usr/lib/notification-daemon/notification-daemon ]];then
    bash -c "/usr/lib/notification-daemon/notification-daemon >/dev/null 2>&1&"
elif [[ -f /usr/libexec/notification-daemon ]];then
     bash -c "/usr/libexec/notification-daemon >/dev/null 2>&1&"
fi

# fix /run/screen permission
if [[ -f /run/screen ]]; then
    sudo chmod 0777 /run/screen
fi

# need java application run
export _JAVA_AWT_WM_NONREPARENTING=1

# allow run gui app from sudo -u user bash -c "firefox-bin"
if [[ -x "$(command -v xhost)" ]]; then
    xhost si:localuser:user
fi

cat ~/.dwm/scripts/startup/client/03_redshift.sh

cat 03_redshift.sh
#!/usr/bin/env bash

TARGET="redshift"
PRELOAD=""
ARGS=""

if [[ -x "$(command -v ${TARGET})" || -n ${TARGET} ]]; then
        sudo -u $USER sh -c "${PRELOAD} ${TARGET} ${ARGS} 2>/dev/null &"
fi
cat ~/.dwm/scripts/startup/client/04_xscreensaver.sh
#!/usr/bin/env bash
# set -x


if [[ -f /etc/PROFILE ]]; then
    source /etc/PROFILE
fi

if [[ -z "${PROFILE_SCREENSAVER_TIME_LOCK}" ]];then
    PROFILE_SCREENSAVER_TIME_LOCK=15
fi
echo "${PROFILE_SCREENSAVER_TIME_LOCK}"
exit

TARGET="xautolock -time ${PROFILE_SCREENSAVER_TIME_LOCK} -locker"
PRELOAD=""
ARGS="xscreensaver -no-splash"

if [[ -x "$(command -v slock)" || -n "slock" ]]; then
    ARGS="slock"
fi

sudo -u $USER bash -c "${PRELOAD} ${TARGET} ${ARGS} 2>/dev/null &"

В принципе всё работает, только при перезапуске windows manager, появляются дубликаты запущенных приложений в фоне(например redshift). Тут или это всё как-то пофиксить или всё переделать на systemd. Если переделывать на systemd, то всё не особо тривиально:

  1. есть консольные приложения, которые можно запускать в произвольном порядке
  2. есть консольные приложения, которые нужно запускать в определенном порядке, возможно с таймаутом
  3. есть гуёвые приложения, которые надо запускать в определенном порядке, желательно с некоторым таймаутом, чтобы система не «захлёбывалась»
  4. как бы это всё сделать так, чтобы можно было применить автоматизацию(скажем, через хуки того же portage). Получается так, мы ставим три гуёвых приложения. Keepassxc, telegram-desktop, deluge. Запускаться они должны строго в этом порядке. Итак, deluge должен запуститься после telegram-desktop. Но если у нас нет telegram-desktop? Если поставить в deluge After=telegram.service, то при отсутствии telegram-desktop как быть?

Пока вот так сделал(но это 146%) не правильно: ls -1 ~/.config/systemd/user

01_common.service
02_idle_shutdown.service
03_redshift.service
04_xscreensaver.service

cat ~/.config/systemd/user/01_common.service

[Unit]
Description=01_common service

[Service]
ExecStart=/home/user/.dwm/scripts/startup/client/01_common.sh
Restart=always
Environment=DISPLAY=:0

[Install]
WantedBy=default.target

cat ~/.config/systemd/user/03_redshift.service

# [Unit]
# Description=03_redshift service
# After=02_idle_shutdown.service

# [Service]
# ExecStart=redshift
# Restart=always
# Environment=DISPLAY=:0

# [Install]
# WantedBy=default.target


[Unit]
Description=Redshift adjusts the color temperature of your screen according to your surroundings
Documentation=http://jonls.dk/redshift/
#After=graphical.target
After=multi-user.target

[Service]
Type=simple
Environment=DISPLAY=:0
ExecStart=redshift
TimeoutStopSec=5

[Install]
WantedBy=graphical.target

cat ~/.config/systemd/user/04_xscreensaver.service

[Unit]
Description=04_xscreensaver service
After=03_redshift.service

[Service]
ExecStart=/home/user/.dwm/scripts/startup/client/04_xscreensaver.sh
Environment=DISPLAY=:0

[Install]
WantedBy=default.target

неактивные(убрал в temp) cat ~/.config/systemd/user/temp/keepassx.service

[Unit]
Description=Keepassx service

[Service]
ExecStart=/usr/bin/keepassxc
Restart=always
Environment=DISPLAY=:0

[Install]
WantedBy=default.target

cat ~/.config/systemd/user/temp/firefox.service

[Unit]
Description=Firefox service
After=telegram.service

[Service]
ExecStart=/usr/bin/firefox-bin
Restart=always
Environment=DISPLAY=:0

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

cat ~/.config/systemd/user/temp/deluge.service

[Unit]
Description=Deluge service
After=firefox.service

[Service]
ExecStart=/usr/bin/deluge
Restart=always
Environment=DISPLAY=:0

[Install]
WantedBy=default.target

PS: с redshift есть баг: если перезапустить display-manager, то он перестает работать. Работает только если вручную его перезапустить

★★★

Последнее исправление: serg002 (всего исправлений: 1)

Вот, а у меня в комплекте с awesomeWM пришёл скрипт вида

## run (only once) processes which spawn with the same name
function run {
   if (command -v $1 && ! pgrep $1); then
     $@&
   fi
}
...
run xfsettingsd
run nm-applet
...

Больше мне и не надо.

А ещё есть всякое в /etc/xdg, но как там реализовать последовательность/задержки запуска я не знаю

ЗЫ. А что за странная идея с

ExecStart=/usr/bin/firefox-bin
Restart=always

Какой тут смысл?

Flotsky ★★
()
Ответ на: комментарий от imul

Его список ls -1 ~/.dwm/scripts/startup/client ну совсем на киоск не похож.

Да и браузер я в киоске запускал бы минуя WM. И скорее всего только браузер и ничего более.

Flotsky ★★
()
Ответ на: комментарий от imul

Смысл в том, если я его кильну, чтобы он заново запустился

serg002 ★★★
() автор топика

появляются дубликаты запущенных приложений в фоне(например redshift)

Что мешает pgrep’ом redshift отслеживать?

Смысл в том, если я его кильну, чтобы он заново запустился

Тут залип и не особо понял смысла. Если делаешь Restart=always, браузер же при закрытии снова откроется. Так и надо?

MrBackToPython
()

В 03_redshift.sh используется неопределенная переменная $USER -

if [[ -f /etc/PROFILE ]]; then
    source /etc/PROFILE
fi

видимо забыли добавить?

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)
Ответ на: комментарий от serg002

Сори - это мои тараканы - только вчера боролся с автозапуском через /etc/rc.d/rc.local
Вернее с тем, что на этом этапе еще нет $USER

sigurd ★★★★★
()
Последнее исправление: sigurd (всего исправлений: 1)

Понавыдумывали ереси. Диды писали в /etc/rc.local и всё работало

DumLemming ★★
()
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)