Как определить, запущен ли модуль systemd с помощью apt-get или во время загрузки?

Когда Вы используете -R переключатель к chmod, Вы говорите, что хотите применить рассматриваемое изменение полномочий в файлах и папке рекурсивно.

Нет никакого способа сказать chmod только применять эти настройки к одной или другому, таким образом, Вы - только обращение за помощью, означает включить в список помощь инструмента такой как find создать список каталогов, и затем exec chmod управляйте выборочно против этого списка.

Можно сделать это более эффективным путем вызова chmod через exec путем вызова его как так, использования + вариант exec команда:

$ find /path/to/folder -type d -exec chmod g+s {} +
4
21.05.2015, 01:40
2 ответа

EDIT: Обратите внимание, что я говорю только о PID 1, потому что я не умею писать на английском и подумал, что вы хотите проверить ваш основной процесс init. Измените его на интересующий вас. Я уверен, что systemd как-нибудь выплюнет PID для вас. Или, если нет, ps ax |grep [commandname] сделает это. Вероятно, вам также потребуется настроить разницу во времени между временем работы и временем выполнения процесса, просто добавьте +3 или что-то еще в строку bc./EDIT

Я не использую systemd, поэтому примите это с долей соли. Агностно-системный способ заключается в сравнении времени запуска интересующего вас процесса и времени работы системы. Вы можете получить их с помощью ps -o etimes [PID]. Традиционно PID 1 зарезервирован для процесса init, но я не знаю, придерживается ли этого systemd. Проверьте с помощью ps 1, действительно ли это тот процесс, который вас интересует, и настройте, если нет. Вы можете получить время работы системы в секундах (среди прочего) с помощью cat /proc/uptime |cut -d "." -f 1. Разделителем для cut является точка, поскольку ps отбрасывает и десятичные знаки.

сравните их с bc или вашим любимым способом. Примером командной строки может быть: echo $(cut -d "." -f 1 /proc/uptime)"-"$(ps -o etimes [PID] |tail -n 1 |tr -d ' \t')|bc Ожидаемый результат - 0, если процесс запущен во время загрузки. Вы можете проверить, соответствует ли он вашим выводам. Для сценариев командной оболочки я бы прогнал их через тесты if/then и принял бы +-3 секунды в качестве времени загрузки. По крайней мере, одну секунду. Иначе вы можете иногда получать ненулевой ответ, если их время загрузки отличается даже на малую долю секунды, что может привести к трудноотлаживаемым ошибкам.

0
27.01.2020, 21:06

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

Однако это можно обойти, добавив специальную логику в блок службы, например:

[Unit]
...
ConditionPathExists=!/run/service-was-started-before

[Service]
...
ExecStartPre=touch /run/service-was-started-before
...

Или вы можете запускать команду только во время загрузки, используя таймер systemd (см. systemd.timer(5)) или старый добрый cron.

-1
27.01.2020, 21:06

Теги

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