Установить StandardOutput=null в файле службы, который запускает скрипт, эквивалентно перенаправлению стандартного вывода скрипта в /dev/null?

Вопрос или проблема

Моя текущая служба и скрипт оболочки

У меня есть файл службы 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, т.е. всё, что будет записано в него, будет потеряно.

Поэтому я думаю внести следующие изменения в мои файлы:

  1. myservice.service становится (добавить StandardOutput=null):
...
[Service]
Type=forking
ExecStart=/usr/bin/myscript.sh
PIDFile=/dev/shm/myscript.pid
StandardOutput=null
...
  1. 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.

Вот что вы предложили:

  1. В myservice.service добавляется строка StandardOutput=null:

    [Service]
    Type=forking
    ExecStart=/usr/bin/myscript.sh
    PIDFile=/dev/shm/myscript.pid
    StandardOutput=null
  2. В myscript.sh, вы убираете > /dev/null:

    #!/bin/sh
    /usr/bin/script-python.py &
    echo $! > /dev/shm/myscript.pid

Итоги

После этих изменений поведение вашей системы останется прежним: все стандартные выводы скрипта script-python.py по-прежнему будут теряться. Нет никаких отличий в том, как стандартный вывод обрабатывается, поскольку и в первом, и во втором случае он будет направлен в /dev/null.

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

Таким образом, изменив конфигурацию, вы получите идентичный результат, но с более элегантной реализацией.

Оцените материал
Добавить комментарий

Капча загружается...