В идеале я не хотел бы изменять файл конфигурации выше.
Tough! Это правильно.
Вам нужно превратить ваш exec
в script
и прекратить запуск этой программы на python в разветвленном подпроцессе как часть конвейера. Этот ответ ServerFault объясняет, как сделать это во встроенном сценарии оболочки. Я бы внес всего одно изменение в сценарий, приведенный там, в последней строке:
exec python -u /opt/XYZ/my_prog.py 2>&1
В конце концов, нет веской причины не регистрировать стандартную ошибку.
Все более сложные движения, чтобы справиться с разветвлением, от expect daemon
до переключения на systemd
, упускают момент, когда правильная вещь - это остановить разветвление демона. Если есть что-то хорошее из нынешнего беспорядка, это постоянное подтверждение того, что то, что IBM написала и рекомендовала в 1995 году, было правильным все эти годы.
Привыкайте к идее демонов загрузки цепей . Есть множество наборов инструментов, которые делают такие вещи простыми. Привыкайте к идее не использовать сценарии оболочки тоже. Существует множество наборов инструментов, разработанных специально для этой работы, которые устраняют накладные расходы оболочек (что является известной хорошей идеей в мире Ubuntu).
Например: Команды оболочки в ответе ServerFault могут быть заменены сценарием, который использует инструменты execline
Лорана Берко, которые предназначены для того, чтобы делать это без субоболочек и несвязанных FIFO:
#!/command/execlineb -PW
pipeline -w {
logger -t my_prog.py
}
fdmove -c 2 1
python -u /opt/XYZ/my_prog.py
который вы бы тогда просто
exec /foo/this_execlineb_script
С моим набором инструментов nosh
это также будет скрипт, содержащий:
#!/usr/local/bin/nosh
pipe
fdmove -c 2 1
python -u /opt/XYZ/my_prog.py | logger -t my_prog.py
Или, альтернативно, этот раздел можно было бы указать непосредственно в определении задания Upstart (используя трюк, чтобы избежать метасимволов оболочки, чтобы Upstart не порождал оболочку):
exec /usr/local/bin/exec pipe --separator SPLIT fdmove -c 2 1 python -u /opt/XYZ/my_prog.py SPLIT logger -t my_prog.py
дальнейшее чтение