Есть 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, то всё не особо тривиально:
- есть консольные приложения, которые можно запускать в произвольном порядке
- есть консольные приложения, которые нужно запускать в определенном порядке, возможно с таймаутом
- есть гуёвые приложения, которые надо запускать в определенном порядке, желательно с некоторым таймаутом, чтобы система не «захлёбывалась»
- как бы это всё сделать так, чтобы можно было применить автоматизацию(скажем, через хуки того же 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, то он перестает работать. Работает только если вручную его перезапустить