Ich versuche, einen Prozess in Javascript zu erzeugen und ihn nach einiger Zeit zu beenden (zu Testzwecken).
Am Ende wird der Prozess eine Endlosschleife sein, die ich zu einem bestimmten Zeitpunkt mit verschiedenen Argumenten neu starten muss. Daher dachte ich, dass das Abrufen und Beenden des Prozesses der beste Weg ist, dies zu tun.
Mein Testcode lautet:
var spawn=require('child_process').spawn
, child=null;
child=spawn('omxplayer', ['test.mp4'], function(){console.log('end');}, {timeout:6000});
console.log('Timeout');
setTimeout(function(){
console.log('kill');
child.kill();
}, 1200);
child.stdout.on('data', function(data){
console.log('stdout:'+data);
});
child.stderr.on('data', function(data){
console.log('stderr:'+data);
});
child.stdin.on('data', function(data){
console.log('stdin:'+data);
});
Das Ergebnis ist:
#~$ node test.js
Timeout
kill
Aber ich muss immer noch Strg + C senden, um das Programm zu beenden. Was vermisse ich?
Auf Raspbian, Knoten 0.10.17, ist Omxplayer eine Binärdatei (Video-Player).
Ich habe es versucht:
chmod +x
Zur App hinzugefügt .- Als root gestartet.
- Pause des untergeordneten Prozesses. Verwenden aller terminierungsbezogenen Signale im Befehl kill.
Ich habe auch einen ps
Befehl gestartet, während die App ausgeführt wurde:
2145 bash
2174 node
2175 omxplayer
2176 omxplayer.bin
2177 ps
Omxplayer ist also ein Wrapper, der den untergeordneten Prozess nicht beendet, wenn er endet. Gibt es eine Möglichkeit, die PID des verpackten Prozesses zu ermitteln?
Immer noch beißender Staub, versuchte dies:
spawn('kill', ['-QUIT', '-$(ps opgid= '+child.pid+')']);
Was ich dachte, würde alle Kinder von Omxplayer töten, ich weiß nicht, ob die Verwendung von Spawn so falsch ist oder ob es der Code ist, der nicht funktioniert.
Die letzte Änderung, die ich vorgenommen habe, war die gute Antwort, musste aber etwas bearbeitet werden.
Ich habe eine sh-Datei (mit Ausführungsrecht) wie folgt erstellt:
PID=$1
PGID=$(ps opgid= "$PID")
kill -QUIT -"$PGID"
Was ich so anfange:
execF('kill.sh', [child.pid], function(){
console.log('killed');
});
Anstelle von child.kill
.
Ich bin mir nicht sicher, ob dies der beste Weg ist oder ob der Code sauber ist, aber es funktioniert.
Ich akzeptiere jede Antwort, die es sauberer oder noch besser macht, ohne eine Datei ausführen zu müssen.