Shellscript aus Programm ausführen und bei Bedarf sauber killen?
Von: Manuel Reimer (mreimer@expires-31-07-2009.news-group.org) [Profil]
Datum: 19.07.2009 17:06
Message-ID: <1248016004.02@user.newsoffice.de>
Newsgroup: de.comp.lang.c
Datum: 19.07.2009 17:06
Message-ID: <1248016004.02@user.newsoffice.de>
Newsgroup: de.comp.lang.c
Hallo,
da ich jetzt schon einige Zeit erfolglos daran rumprobiere, frage ich
jetzt lieber mal die Experten... Ich benötige eine Möglichkeit aus einem
laufenden Programm ein Shellscript nicht nur anzustarten, sondern bei
Bedarf auch wieder zu beenden. Der Vorgang muss beliebig wiederholbar
sein.
Gegeben ist ein Beispiel-Shellscript in dieser Form:
#!/bin/sh
echo "Our PID is $$"
wget -O - http://listen.technobase.fm/tunein-aacplus-pls | cat >
/dev/null
Es handelt sich nur um ein Beispiel und das "cat" ist absichtlich
dazwischen. Die PID wird ausgegeben und erlaubt so einige Versuche mit
"kill". Schon auf der Shell zeigt sich, dass man das Script garnicht mal
so einfach wieder loswird. Ein einfaches
kill -s INT [PID]
bewirkt garnichts. Das ganze mit "SIGTERM" oder "SIGHUP" stoppt dann
nur
das Shellscript selbst. "wget" läuft ungehindert weiter. Erst ein
kill -s INT -- -[PID]
sorgt für Ordnung und beendet das Script. Es muss also wohl zwingend
eine Prozessgruppe gebildet und bei Bedarf auch die ganze Gruppe gekillt
werden.
Um das auszuprobieren habe ich folgendes Testprogramm gebaut:
#include <unistd.h>
#include <signal.h>
#include <stdio.h>
int pid;
int main(void) {
pid = fork();
// Check if child process
if (pid == 0) {
setsid();
if (execl("/bin/sh", "sh", "-c", "./test.sh",
NULL) == -1) {
printf("ERROR: Script execution failed!\n");
_exit(1);
}
_exit(0);
}
sleep(10);
printf("Killing now\n");
if ( killpg(pid, SIGINT) < 0 ) {
printf("Error while kill(SIGINT)");
}
}
Das Shellscript wird also gestartet und nach 10 Sekunden beendet. Damit
habe ich jetzt folgende Probleme:
- Was ist mit den "geklonten Filedescriptoren" aus dem Parent-Prozess?
Muss ich die schließen, oder zumindest teilweise schließen? Schön
wäre,
wenn ich alles zubekomme und nur STDOUT und STDERR stehen bleibt. Ich
habe verschiedenes probiert, aber entweder ist immer alles zu, oder
STDOUT und STDERR funktionieren bei einem Scriptaufruf noch, beim
nächsten sind sie aber komischerweise verschwunden. Geteset habe ich
mit:
for (int i = STDERR_FILENO + 1; i < getdtablesize(); i++) close(i);
einmal vor und einmal hinter setsid().
STDOUT und STDERR *müssen* in den Unterprozess weitergereicht werden!
- Gibt es sowas wie "Unter-Prozessgruppen"? Ein Problem, das ich mir mit
obiger Lösung geholt habe, ist, dass ein SIGINT auf den ursprünglichen
Parent-Prozess meine neue Prozessgruppe nun nicht mehr erreicht. Im
Beispiel des obigen Testprogramms wird das Testprogramm zwar beendet,
aber wget läuft weiter. Das soll so nicht sein! Kann ich die ganze
Prozessgruppe dem ursprünglichen "Parent-Prozess" unterordnen, dass ein
SIGINT, SIGHUP, SIGTERM oder wasauchimmer auch meine neue Gruppe
erreicht?
Danke vielmals im Voraus
CU
Manuel
--
www.jetzt-abwaehlen.de Wählen gehen 2009! Ein Aufruf etwas zu ändern.
Der Mensch erfand Maschinen, um sich damit die Arbeit zu erleichtern.
Nur leider hat er vergessen, rechtzeitig damit aufzuhören...
Beiträge mit *X-No-Html Header* kann ich weder lesen, noch beantworten!
[ Auf dieses Posting antworten ]Antworten
- Claus Reibenstein (19.07.2009 17:13)
