Вопрос или проблема
Моя текущая служба и скрипт оболочки
У меня есть файл службы systemd под названием myservice.service
. Служба запускается при загрузке. Служба запускает скрипт оболочки /usr/bin/myscript.sh
, как показано ниже в разделе [Service]
:
...
[Service]
Type=forking
ExecStart=/usr/bin/myscript.sh
PIDFile=/dev/shm/myscript.pid
...
Содержимое скрипта:
#!/bin/sh
/usr/bin/script-python.py > /dev/null &
echo $! > /dev/shm/myscript.pid
Скрипт оболочки myscript.sh
запускает Python-скрипт: script-python.py
. При помощи перенаправления > /dev/null
стандартный вывод script-python.py
перенаправляется в /dev/null
и таким образом теряется.
Изменения для использования Service->StandardOutput=null
В документации systemd по StandardOutput я прочитал следующую фразу:
null подключает стандартный вывод к /dev/null, т.е. всё, что будет записано в него, будет потеряно.
Поэтому я думаю внести следующие изменения в мои файлы:
myservice.service
становится (добавитьStandardOutput=null
):
...
[Service]
Type=forking
ExecStart=/usr/bin/myscript.sh
PIDFile=/dev/shm/myscript.pid
StandardOutput=null
...
myscript.sh
становится (убрать>/dev/null
):
#!/bin/sh
/usr/bin/script-python.py &
echo $! > /dev/shm/myscript.pid
Мой вопрос
Мой вопрос: если я внесу изменения, показанные выше, результат останется точно таким же, как в моей текущей ситуации: весь вывод script-python.py
будет потерян? Нет ли никаких отличий?
Ответ или решение
Да, изменения, которые вы планируете внести в свои файлы, действительно приведут к тому, что результат будет эквивалентен текущей ситуации, при которой все выводы скрипта script-python.py
будут потеряны.
Текущая ситуация
В вашей текущей конфигурации myservice.service
, вы перенаправляете стандартный вывод скрипта script-python.py
в /dev/null
прямо в самом скрипте myscript.sh
с помощью следующей строки:
/usr/bin/script-python.py > /dev/null &
При этом, все данные, которые script-python.py
пытается вывести, будут поглощены /dev/null
и не будут доступны нигде. Скрипт myscript.sh
также продолжает выполнять свои задачи и управлять PID скрипта Python.
Предложенные изменения
С вашим предложением изменить файл myservice.service
, добавив StandardOutput=null
, вы устанавливаете политику для systemd, которая перенаправляет стандартный вывод всех процессов, связанных с вашей службой, в /dev/null
. Таким образом, вам не нужно будет добавлять дополнительное перенаправление в самом скрипте myscript.sh
.
Вот что вы предложили:
-
В
myservice.service
добавляется строкаStandardOutput=null
:[Service] Type=forking ExecStart=/usr/bin/myscript.sh PIDFile=/dev/shm/myscript.pid StandardOutput=null
-
В
myscript.sh
, вы убираете> /dev/null
:#!/bin/sh /usr/bin/script-python.py & echo $! > /dev/shm/myscript.pid
Итоги
После этих изменений поведение вашей системы останется прежним: все стандартные выводы скрипта script-python.py
по-прежнему будут теряться. Нет никаких отличий в том, как стандартный вывод обрабатывается, поскольку и в первом, и во втором случае он будет направлен в /dev/null
.
Основное преимущество предложенного вами решения заключается в том, что управление перенаправлением вывода теперь возложено на systemd, что делает код вашего скрипта более чистым и менее зависимым от перенаправлений в самом скрипте. Это улучшает читаемость и удобство сопровождения кода, особенно если в будущем вам потребуется настроить другие параметры вывода или логирования.
Таким образом, изменив конфигурацию, вы получите идентичный результат, но с более элегантной реализацией.