2016-08-07 16 views
1

Ich versuche, ein Start-Skript und ein Stop-Skript für mein Projekt zu erstellen. Ich muss einen Sass Auto-Compiler sowie einen Server laufen lassen und die Ausgabe von beiden in eine Datei umleiten. Ich verwende dafür lite-server und sass --watch.Kill Hintergrund Prozesse in Linux

Damit diese Prozesse gleichzeitig ausgeführt werden, verwende ich &, um die Prozesse zu untersuchen. Dies stellt die Herausforderung dar, die Skripte zu stoppen, ich kann die Skripte nicht mit Ctrl+C stoppen, wie ich es normalerweise tun würde. Ich dachte, ich würde dies überwinden, indem ich die Prozess-IDs in einer Textdatei ablegen würde.

kam ich mit dem folgenden „Start“ Skript auf:

# Start a sass watcher and a server running simultaneously. Store the PIDs in a 
# text file so that the processes can be easily stopped. 

(
    lite-server & 
    echo $! > .pids.txt & 
    sass --watch sass:css --style=compressed & 
    echo $! >> .pids.txt & 
) &> log.txt 
cat .pids.txt 

Dann werden die Prozesse zu stoppen, ich bin mit

kill $(cat .pids.txt) 

die Prozess-IDs Schreiben in eine Textdatei scheint Art von Haschisch. Gibt es einen besseren Weg, um das zu erreichen, was ich versuche?

+0

Ohne die PIDs in eine Textdatei zu schreiben, können diese Prozesse nur einmal (eine Instanz) auf Ihrem Computer ausgeführt werden, Sie können den Befehl 'killall' verwenden. 'killall -s KILL lite-server sass' (entweder einzeln oder kombiniert) – VanagaS

+0

Ok, cool. Ich denke nicht, dass dies die beste Vorgehensweise wäre, aber es macht Sinn. –

Antwort

1

Sie könnten sie in einem Array speichern, wenn Sie das nicht hackisch nennen würden.

EDIT: Eine andere Möglichkeit ist, einfach auszuführen:

kill $(jobs -p) 

Dies tötet alle Hintergrundprozesse (Jobs -p druckt die PIDs aller Hintergrundprozess auf stdout, die dann zu töten Gabe).

+0

Da ich jemand bin, der so gut wie nichts über Bash weiß, könnten Sie ein Beispiel geben? –

+0

Leider bin ich auch jemand, der fast nichts über bash weiß, ich weiß nur, dass man Arrays in bash verwenden kann, aber nie selbst. Die Bash-Referenz auf Arrays (https://www.gnu.org/software/bash/manual/bash.html#Arrays) scheint darauf hinzuweisen, dass die Verwendung von Arrays sehr einfach ist. Sie können einfach eine Indexvariable einfügen und sie jedes Mal erhöhen, wenn Sie etwas im Array gespeichert haben: '((i ++)); echo $! > array [i] Um alle Prozesse mit den IDs im Array zu beenden, könnten Sie eine for-Schleife verwenden, in der Sie i dekrementieren, bis es wieder Null ist, und einen Kill für jedes gefundene PID ausgeben. Bitte beachten Sie, dass ich diesen Code nicht getestet habe. – kay

+0

Ok. Vielen Dank. Ich werde das überprüfen –

1

sollten Sie hinzufügen, welche Art von „kill“ Sie wollen .. wie: kill -9 $(cat .pids.txt)

2

Ich ziehe es kann für den Prozess grep und den Prozess zu töten, anstatt die PIDs in einer Datei zu halten.

ps -ef | grep lite-server | awk '{print $2}' | kill -9 

I zweite Spalte in der Ausgabe von ps -ef nehmen ist PID des Prozesses lite-server in Ihrem Server.

Verwandte Themen