LINUX.ORG.RU
ФорумAdmin

systemd: Не стартует автоматически кастомный скрипт после перезапуска системы

 , , ,


0

1

Здравствуйте! unit-file:

[Unit]
Description=Script watches the events from xscreensaver and resets keyboard layout to english only on lock, and adds the ru layout back upon unblank.
# After=local-fs.target

[Service]
ExecStart=/usr/bin/xscreensaver_lock_reset_kbd_layout_to_en.pl
# Type=forking

[Install]
WantedBy=multi-user.target

Сам скрипт:

#!/usr/bin/perl

my $blanked = 0;
open (IN, "xscreensaver-command -watch |");
while (<IN>) {
    if (m/^(BLANK|LOCK)/) {
        if (!$blanked) {
           system "DISPLAY=\":0\" setxkbmap -layout us";
           $blanked = 1;
        }
    } elsif (m/^UNBLANK/) {
        system "DISPLAY=\":0\" setxkbmap -layout us,ru";
        $blanked = 0;
    }
}

При этом если просто уже после логина набрать systemctl start xscreensaver_lock_reset_kbd_layout_to_en.service, то всё работает нормально…
При этом в логах journalctl только вот это:

xscreensaver_lock_reset_kbd_layout_to_en.pl[31091]: xscreensaver-command: warning: $DISPLAY is not set: defaulting to ":0.0".


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

Ответ на: комментарий от Eid010n

Похоже, что, возможно, дело было не только в этом…
Периодически после рестарта системы сервис опять оказывается мертвый, но теперь стало появляться новое сообщение в логах, которого раньше не было: No protocol specified.

[user-pc user]# systemctl status xscreensaver_lock_reset_kbd_layout_to_en.service
● xscreensaver_lock_reset_kbd_layout_to_en.service - Script watches the events from xscreensaver and resets keyboard layout to english only on lock, and adds the ru layout back upon unblank.
   Loaded: loaded (/etc/systemd/system/xscreensaver_lock_reset_kbd_layout_to_en.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since Tue 2020-03-03 14:05:58 +06; 10s ago
  Process: 12234 ExecStart=/usr/bin/xscreensaver_lock_reset_kbd_layout_to_en.pl (code=exited, status=0/SUCCESS)
 Main PID: 12234 (code=exited, status=0/SUCCESS)

 user-pc systemd[1]: Started Script watches the events from xscreensaver and resets keyboard layout to english only on lock, and adds the ru layout back upon unblank..
 user-pc xscreensaver_lock_reset_kbd_layout_to_en.pl[12234]: xscreensaver-command: warning: $DISPLAY is not set: defaulting to ":0.0".
 user-pc xscreensaver_lock_reset_kbd_layout_to_en.pl[12234]: No protocol specified
 user-pc xscreensaver_lock_reset_kbd_layout_to_en.pl[12234]: xscreensaver-command: can't open display :0.0
 user-pc systemd[1]: xscreensaver_lock_reset_kbd_layout_to_en.service: Succeeded.

Может ему нужно еще какие-нибудь зависимые вещи прописать, типа, After, Requires, Wants ?..

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

очевидно, потому что systemd пытается запустить этот юнит до инициализации графического режима. Самое простое решение - прописать его запуск в автозапуске твоей DE.

Lrrr ★★★★★
()
Ответ на: комментарий от deep-purple

Нет, конечно, т. к. «графика» запускается дисплейным менеджером асинхронно и systemd об этом ничего не знает.

intelfx ★★★★★
()

ТСу: всё правильно написали. Твой юнит запускается в произвольный момент времени и практически наверняка до запуска X-сервера. Сделать с этим в целом ничего нельзя.

Если тебе нужно повзаимодействовать с X-сервером, то systemd — неподходящий для этого инструмент. Юзай xdg-autostart или xinitrc.

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

systemd: Не стартует автоматически кастомный скрипт после перезапуска системы

Обратитесь в службу поддержки Red Hat.

anonymous
()
Ответ на: комментарий от SergeySVold

Да не работает это. $DISPLAY в окружение systemd --user попадает асинхронно всё из того же xinitrc в произвольный момент после открытия сессии и начала исполнения default.target, равно как и запуск X-сервера в принципе.

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

Честно нет времени мандалу разводить. В systemd всё это делается. В данном случае, самый простой вариант, взвести какую нибудь задержку. Вариантов куча - и after target и restart и … в общем вариантов дочерта. В моём понимании systemd слишком… крут чтоли для этой задачи. В общем счас не когда.

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

делается

взвести какую нибудь задержку

Лол.

Я ему про несовпадение времён жизни и состояния гонки, а он мне про sleep driven programming.

Когда говорят «делается», имеют в виду другое.

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

В те редкие минуты, когда я ссорюсь с фряшей и в порыве гнева кричу, что всё, хватит, я перевожу серверы на линукс, я просто захожу на ЛОР и благодарю судьбу, что я не линуксоид.

anonymous
()
Ответ на: комментарий от anonymous

Да, я в курсе. Но это зависит от DM/DE и требует усердного напилинга. Ну и ответ там кстати неполный, не рассматривается остановка этих сервисов при завершении сессии.

intelfx ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.