Idealnie nie chciałbym modyfikować powyższego pliku konfiguracyjnego.
Twardy! To jest właściwe.
Musisz zmienić swój exec
na script
i przestać uruchamiać ten program python w rozwidlonym podprocesie jako część potoku. Ta odpowiedź ServerFault wyjaśnia, jak to zrobić we wbudowanym skrypcie powłoki. Wprowadziłbym tylko jedną zmianę do podanego tam skryptu, w ostatnim wierszu:
exec python -u /opt/XYZ/my_prog.py 2>&1
W końcu nie ma naprawdę dobrego powodu, aby nie rejestrować standardowych błędów.
Coraz bardziej skomplikowane wahania, aby poradzić sobie z rozwidleniem, od expect daemon
przejścia do systemd
, pomijają punkt, w którym właściwym rozwiązaniem jest powstrzymanie demona przed rozwidleniem . Jeśli z obecnej kerfuffli jest jedna dobra rzecz, jest to ciągłe potwierdzenie, że to, co IBM napisał i zalecił w 1995 roku, było słuszne przez te wszystkie lata.
Przyzwyczaj się do idei demonów ładujących łańcuch . Istnieje wiele zestawów narzędzi, które upraszczają takie rzeczy. Przyzwyczaj się również do tego, aby nie używać skryptów powłoki. Istnieje wiele zestawów narzędzi zaprojektowanych specjalnie do tej pracy, które eliminują narzuty powłok ( co jest znanym dobrym pomysłem w świecie Ubuntu ).
Na przykład: polecenia powłoki w odpowiedzi ServerFault można zastąpić skryptem, który korzysta z execline
narzędzi Laurenta Bercota, które zostały zaprojektowane tak, aby móc to zrobić bez podpowłoki i niepowiązanych FIFO:
#!/command/execlineb -PW
pipeline -w {
logger -t my_prog.py
}
fdmove -c 2 1
python -u /opt/XYZ/my_prog.py
co byś wtedy po prostu
exec /foo/this_execlineb_script
Z moim nosh
zestawem narzędzi podobnie byłby skrypt zawierający:
#!/usr/local/bin/nosh
pipe
fdmove -c 2 1
python -u /opt/XYZ/my_prog.py | logger -t my_prog.py
Lub alternatywnie, można mieć tę zwrotkę bezpośrednio w definicji zadania Upstart (używając sztuczki, aby uniknąć metaznaków powłoki, aby Upstart nie spawnował powłoki):
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
Dalsza lektura
Pominąłeś oczekiwany zwrotkę. Nowa książka kucharska określa:
Potrzebujesz tego, ponieważ |używany potok tworzy procesy potomne. W książce Advanced Linux programowanie można znaleźć krótkie wprowadzenie do tego, w którym stwierdzono, że:
Nie wiem, czy oznacza to jeden czy dwa widelce, więc eksperymentowałbym ze zmodyfikowaniem odrodzenia linii w twoim kodzie za pomocą
lub
Nie sądzę, że można to osiągnąć tylko dzięki systemd , chociaż moje logo wyraźnie pokazuje, że jestem fanem systemd .
źródło
systemd
jednym nie byłoby zatrudnienielogger
w pierwszej kolejności. Standardowe dane wyjściowe i błędy można przesyłać bezpośrednio do dziennika; nie wymaga podprocesów ani potoku w definicji usługi.upstart
; i za zwróceniesystemd
na nią, a potem mówią, że może nawet być wykonane bezsystemd
wkłada wózek całkowicie przed koniem. To nie jest coś, z czym rozsądnie by się zrobiłosystemd
. Więc podkreślając, że może nawet być wykonane bezsystemd
jest w najlepszym wypadku dziwne. Poza tym nie jest to stanowcze. Jest to raczej zasadnicza część pytania.