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

Один хороший человек на IRC канале #archlinux32помог сообщить, что решением может быть опция для snd-hda-intelмодуля ядра:model=6stackили model=6stack-digout.

Итак, после перезагрузки этого модуля с опцией все заработало:

modprobe -r snd-hda-intel
modprobe snd-hda-intel model=6stack

Это может быть ошибка в ядре, поэтому оно загружает этот модуль без соответствующей опции, а также патч не работает для этой материнской платы.

Хотя добавление этой опции вручную в /etc/modprobe.d/сообщит системе, что этот модуль следует загружать с этой опцией при каждой следующей загрузке:

echo "options snd-hda-intel model=6stack" >> /etc/modprobe.d/sound_fix.conf

1
03.07.2020, 10:30
3 ответа

Вы можете записать юнит-файл, скажем, в/etc/systemd/system/myprocess.service:

[Unit]
Description=My Process

[Service]
ExecStart=/bin/myprocess
Restart=always

[Install]
WantedBy=multi-user.target

А затем в записи на рабочем столе создайте лаунчер

systemctl start myprocess.service

Но не забудьте не включать эту службу при запуске, поэтому вы можете запустить ее вручную из своей исполняемой записи.
РЕДАКТИРОВАТЬ:
Если вам также нужно запустить в режиме отладки, создайте еще один сервисный модуль с параметром --debug. Вы можете создать еще одну запись на рабочем столе, чтобы указать сценарий, который выглядит как (просто репрезентативная идея)

systemctl stop myprocess.service // to stop previous service
systemctl start processwithdebug.servce // to debug
0
18.03.2021, 23:22

Вы можете заставить systemd сделать за вас часть работы со вторым модулем B, сказав, что он Conflictsс первым модулем A; затем, когда вы запускаете B, он останавливает A. К сожалению, когда B останавливается, A не перезапускается по умолчанию, но вы можете добавить строку OnFailure; если B завершается с ошибкой, A будет запущен. Чтобы гарантировать сбой в случае нормального выхода из B, вы можете использовать ExecStop, который устанавливает код возврата на ненулевой -.

А.сервис:

[Service]
Type=simple
ExecStart=/opt/foo/myapplication

Б.сервис:

[Unit]
Conflicts=A.service
OnFailure=A.service
[Service]
Type=simple
ExecStart=/opt/foo/myapplication --debug
ExecStop=/usr/bin/false
0
18.03.2021, 23:22

Вы можете использовать файл блокировки, чтобы убедиться, что работает только один экземпляр вашего приложения. Вместо systemctl stop myserviceв лаунчере запустите systemctl restart myservice, и через 5 секунд, необходимых для перезапуска приложения, запустите отладочную версию после получения файла блокировки:

systemctl restart myservice
flock /opt/foo/mylock /opt/foo/myapplication --debug

и измените файл модуля, чтобы использовать ту же блокировку:

ExecStart=/usr/bin/flock /opt/foo/mylock /opt/foo/myapplication

Он перезапустится через 5 секунд, затем дождется получения блокировки и удержит ее во время работы приложения. Файл блокировки может быть где угодно. На самом деле вы можете использовать /opt/foo/myapplicationв качестве файла блокировки, но если вы перекомпилируете его или что-то в этом роде, вы потеряете блокировку при ее изменении.

0
18.03.2021, 23:22

Теги

Похожие вопросы