Ich schreibe ein Perl-Skript, das einige Eingaben schreibt und diese Eingaben an ein externes Programm sendet. Es gibt eine kleine, aber nicht Null Chance, dass dieses Programm hängen, und ich möchte es eine Zeitüberschreitung:Wie kann ich einen gegabelten Prozess abbrechen, der hängen könnte?
my $pid = fork;
if ($pid > 0){
eval{
local $SIG{ALRM} = sub { die "TIMEOUT!"};
alarm $num_secs_to_timeout;
waitpid($pid, 0);
alarm 0;
};
}
elsif ($pid == 0){
exec('echo blahblah | program_of_interest');
exit(0);
}
Wie es jetzt aussieht, nach $ num_secs_to_timeout, program_of_interest immer noch besteht. Ich versuchte es in dem anonymen Unterprogramm für $SIG{ALRM}
zu töten, wie folgt:
local $SIG{ALRM} = sub{kill 9, $pid; die "TIMEOUT!"}
aber nicht alles tun. program_of_interest besteht noch immer. Wie gehe ich vor, diesen Prozess zu beenden?
Ich denke, "kill 9, - $ PID" sollte "kill -9, $ PID" sein. Ich habe stattdessen das System ("kill -9 $ PID") verwendet. – Boolean
Ich denke, "kill -9 $ PID" sollte weiter "kill -9 $ pid" sein, aber ja, die negative pid zeigt an, eine Prozessgruppe statt nur einen Prozess zu töten. Aus der Kill-Dokumentation: "Anders als in der Shell, wenn SIGNAL negativ ist, werden Prozessgruppen anstatt Prozesse gelöscht. (Auf System V wird eine negative PROCESS-Nummer auch Prozessgruppen löschen, aber das ist nicht portierbar.)" – simpleuser