2014-10-31 3 views
0

Мне нужно запустить внешнюю программу из службы systemd за пределами текущей cgroup. Я нашел инструмент systemd-run, который, вероятно, решит это, но я застрял в systemd версии 204, где он еще не доступен. Есть ли другое решение?Как запустить внешнюю программу из службы systemd в независимой группе

Моя проблема более подробно:

Application поставляется в пакете DEBiAN и установить и запустить себя как Systemd службы. Эта служба позже загружает более новую версию приложения и запускает dpkg -i myapplication.deb. Сервис должен быть остановлен во время установки обновления, но он не остановится, пока не закончится все процессы в группе. Теперь у нас тупик, потому что dpkg сам работает в этой группе. После тайм-аута остановки службы dpkg убит и обновление не установлено.

ответ

1

Динамически можно создать свою службу в/run/systemd/system path. Этот путь является каталогом службы времени выполнения.

Позже вы сообщите системе о перезагрузке своего состояния. Как только перезагрузка будет завершена, теперь systemd знает о вашем сервисе. Запуск службы произойдет в собственной группе службы.

Я думаю, что вы могли бы сделать что-то вроде этого:

#!/bin/sh 

printf "[Service]\nType=oneshot\nExecStart=dpkg -i myapplication.deb" \ 
> /run/systemd/system/my-dpkg.service 
if [ -f "/run/systemd/system/my-dpkg.service" ]; then 
    systemctl daemon-reload && \ 
    systemctl start dpkg.service 
fi 
+0

Добро пожаловать в StackOverflow. В значительной степени в любое время, когда вы хотите опубликовать код или данные, которые вы хотели бы сохранить в своем форматировании, вы можете отложить его четырьмя пробелами (или вкладкой). # - это короткий код для заголовков, поэтому вместо '#!/bin/sh' мы увидели!/bin/sh в увеличенном тексте. Вы можете сделать встроенный код с backticks (apostrophe-looking thing рядом с 1 ключом выше QWERTY. Поэтому, если я окружу Hello World с помощью '', я получаю «Hello World». –

Смежные вопросы