Hoi @all,
ich baue gerade an einem bzw. mehreren Skripten herum, die mir ein paar Daten sammeln sollen. Daraus sind insgesamt 3 Skripte und ein Prozess entstanden, die wenn ich sie auf der Kommandozeile starte, den Cursor einfach eine Zeile nach unten rücken und Ihren Dienst tun. Das Problem: ich würde das gerne als "Hintergrundprozess" laufen lassen und das Terminal nicht das Terminal offen lassen.
Wie läuft das ganze ab? Ich habe insgesamt 3 Skripte, die unterschiedliche Sachen machen, Basis ist die Auswertung von ATOP. Das sieht also derzeit wie folgt aus:
atop-Aufruf | Skript1 | Skript2 | Skript3
Das ganze kann ich derzeit auf zwei Wegen starten um es in den Hintergrund zu bringen:
a) screen: Starten des Aufrufs und CTRL+A+D b) Starten des Aufrufs mit einem & am Ende (schicks in den Background)
Jetzt möchte ich das ganze in einem INIT-Skript bauen. Sprich mittels
/etc/init.d/meineSkripts start
starten und stoppen können. Hierbei tauchen folgende Probleme auf:
a) welche PID?
Ich will in meinem INIT-Skript gerne eine PID bzw. ein PID-File verwenden. Wenn ich eine Sammlung von Skripten mittels Pipe starte und versuche anschließend die PID zu ermitteln, bekomme ich nur die letzte PID (die des Skript3). Ich hab zwar über PID-Gruppen schon eine Möglichkeit gefunden, alle PIDs zu ermitteln, aber toll ist es nicht)
b) wie bekomme ich das ganze sauber in den Hintergrund?
in diversen init-Skripten, die ich gelesen habe (sshd, etc.) habe ich dasn Stichwort "demonize" gefunden, aber damit kann ich nichts anfangen. Auch die Man-Pages helfen mir nicht wirklich weiter.
Hat jemand von Euch eine Idee, wie ich eine Sammlung von Tools in den Hintergrund schicke? Idealer Weise noch die PID von den einzelnen Prozessen raus bekommen. Vielleicht gibts auch eine Möglichkeit das auf eine PID zu reduzieren.
Als besonderes Bonbon: wenn ich meinen Aufruf starte, dann sehe ich auch alle 3 bzw. 4 Prozesse in der Prozesslist. Gibts hier ne Möglichkeit das zu "vereinen", so dass ich nur einen Prozess in der Prozesslist sehe?
Greetz Maddin
Hallo Martin,
On Tue, Dec 06, 2016 at 22:17:20 +0100, Martin Schuchardt wrote:
Wie läuft das ganze ab? Ich habe insgesamt 3 Skripte, die unterschiedliche Sachen machen, Basis ist die Auswertung von ATOP. Das sieht also derzeit wie folgt aus:
atop-Aufruf | Skript1 | Skript2 | Skript3
Das ganze kann ich derzeit auf zwei Wegen starten um es in den Hintergrund zu bringen:
a) screen: Starten des Aufrufs und CTRL+A+D b) Starten des Aufrufs mit einem & am Ende (schicks in den Background)
Als screen-Fan empfehle ich natuerlich a)
Jetzt möchte ich das ganze in einem INIT-Skript bauen. Sprich mittels
/etc/init.d/meineSkripts start
Geht auch mit screen:
### /usr/local/bin/atop_proc ### #!/bin/sh atop | Skript1 | Skript2 | Skript3
### /etc/init.d/meineSkripts ### #!/bin/sh case "$1" in start) su -c "screen -dmS atopproc /usr/local/bin/atop_proc" atopuser ;; stop) su -c "killall screen" atopuser ;; *) echo "usage: $0 {start|stop}" exit 1 ;; esac exit 0
Das Hilfsskript "atop_proc" dient nur als Buendelung der Pipe-Kette und dass screen mit nur einem Kommando als Argument gestartet werden muss. Das Initskript "/etc/init.d/meineSkripts" startet screen unter dem dedizierten User "atopuser" direkt im Hintergrund (detached mode).
Das Stoppen im Initskript ist zugegeben etwas krude. Es geht davon aus, dass der User "atopuser" nur eine screen-Session besitzt und dass die einzelnen Kommandos in der Session terminieren, wenn sie ihr Terminal verlieren.
in diversen init-Skripten, die ich gelesen habe (sshd, etc.) habe ich dasn Stichwort "demonize" gefunden, aber damit kann ich nichts anfangen. Auch die Man-Pages helfen mir nicht wirklich weiter.
daemon() ist eine Funktion aus der libc, die kannst Du in Skripten nicht verwenden.
Hat jemand von Euch eine Idee, wie ich eine Sammlung von Tools in den Hintergrund schicke? Idealer Weise noch die PID von den einzelnen Prozessen raus bekommen. Vielleicht gibts auch eine Möglichkeit das auf eine PID zu reduzieren.
Siehe oben, mit screen im detached mode.
Als besonderes Bonbon: wenn ich meinen Aufruf starte, dann sehe ich auch alle 3 bzw. 4 Prozesse in der Prozesslist. Gibts hier ne Möglichkeit das zu "vereinen", so dass ich nur einen Prozess in der Prozesslist sehe?
Nein, das geht AFAIK nicht.
Gruss, Chris
Moin,
viele Fragen in einer Mail.
Martin Schuchardt kruemeltee@gmx.de (Di 06 Dez 2016 22:17:20 CET):
Jetzt möchte ich das ganze in einem INIT-Skript bauen. Sprich mittels /etc/init.d/meineSkripts start
Init heißt jetzt meistens systemd.
--/usr/local/bin/foo-- #!/bin/sh # sinnfreie Pipeline sleep 60 | sleep 60 | sleep 60
--/etc/systemd/system/foo.service-- [Unit] Description=Foo test
[Service] ExecStart=/usr/local/bin/foo
Dann kannst Du mit
systemctl start foo systemctl status foo systemctl stop foo … usw …
hantieren
Ich will in meinem INIT-Skript gerne eine PID bzw. ein PID-File verwenden. Wenn ich eine Sammlung von Skripten mittels Pipe starte und versuche anschließend die PID zu ermitteln, bekomme ich nur die letzte PID (die des Skript3). Ich hab zwar über PID-Gruppen schon eine Möglichkeit gefunden, alle PIDs zu ermitteln, aber toll ist es nicht)
Ich meine, in meinem obigen Testscript sorgt der Tot der Parentshell auch für das Killen der Kinder. Aber das hängt auch vom Signal ab. Bei KILL an den Parant leben die Kinder weiter.
Mit systemd passiert das nicht. `systemctl kill --signal=KILL foo.service` haut sie alle weg.
b) wie bekomme ich das ganze sauber in den Hintergrund?
systemd. Der findet es sogar besser, wenn Du Dich um die „Dämonisierung“ nicht kümmerst.
in diversen init-Skripten, die ich gelesen habe (sshd, etc.) habe ich dasn Stichwort "demonize" gefunden, aber damit kann ich nichts anfangen. Auch die Man-Pages helfen mir nicht wirklich weiter.
Ja, das „in den Hintergrung“ gehen ist das daemonize. Verbunden mit verschiedenen anderen Dingen (lossagen vom controlling Terminal, Prozessgruppenführerschaft und was noch alles…)
In der schönen neuen Systemd-Welt ist das eher nicht gewünscht, da ist es für Dich einfacher, einfach alles im Vordergrund zu lassen und den Rest an systemd zu delegieren.
Hat jemand von Euch eine Idee, wie ich eine Sammlung von Tools in den Hintergrund schicke? Idealer Weise noch die PID von den einzelnen Prozessen raus bekommen. Vielleicht gibts auch eine Möglichkeit das auf eine PID zu reduzieren.
Wenn Du threads hast, dann siehst Du i.d.R. nur die PID vom Prozess selbst. Aber ich glaube, dann ist das nichts, was Du in der Shell machen kannst.
Als besonderes Bonbon: wenn ich meinen Aufruf starte, dann sehe ich auch alle 3 bzw. 4 Prozesse in der Prozesslist. Gibts hier ne Möglichkeit das zu "vereinen", so dass ich nur einen Prozess in der Prozesslist sehe?
Nee, sind ja alles Prozesse, die willst Du auch alle sehen. Vielleicht kannst Du mit namespaces experimentieren und die in einen anderen Prozess-Namespace setzen, aber das ist nur sehr salopp geraten.
lug-dd@mailman.schlittermann.de