2016-08-07 3 views
1

J'essaie de créer un script de démarrage et un script d'arrêt pour mon projet. J'ai besoin de lancer un auto-compilateur sass ainsi qu'un serveur, et de rediriger la sortie des deux dans un fichier. J'utilise lite-server et sass --watch pour cela.Tuer des processus d'arrière-plan sous Linux

Pour que ces processus s'exécutent simultanément, j'utilise & pour mettre en arrière-plan les processus. Cela pose le défi d'arrêter les scripts, je ne peux pas arrêter les scripts en utilisant Ctrl+C comme je le ferais normalement. J'ai pensé que je surmonterais cela en stockant les identifiants de processus dans un fichier texte.

je suis venu avec le script suivant « start »:

# 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 

Ensuite, pour arrêter les processus, j'utilise

kill $(cat .pids.txt) 

L'écriture des ID de processus dans un fichier texte semble genre de hackish. Y a-t-il une meilleure façon d'accomplir ce que j'essaie de faire?

+0

Sans écrire les PID dans un fichier texte, si ces processus ne peuvent s'exécuter qu'une seule fois (une instance) dans votre machine, vous pouvez utiliser la commande 'killall'. 'killall -s KILL lite-server sass' (individuellement ou en combinaison) – VanagaS

+0

Ok, cool. Je ne pensais pas que ce serait la meilleure pratique, mais c'est logique. –

Répondre

1

Vous pouvez les stocker dans un tableau, si c'est ce que vous n'appelez pas hackish.

EDIT: Une autre façon est de simplement exécuter:

kill $(jobs -p) 

Cela tue tous les processus d'arrière-plan (les imprime des emplois PIDS de tous les processus d'arrière-plan stdout, qui sont ensuite remis à tuer).

+0

Puisque je ne connais presque rien à propos de bash, pourriez-vous donner un exemple? –

+0

Malheureusement, je suis aussi quelqu'un qui ne connaît presque rien à propos de bash, je sais seulement que l'on peut utiliser des tableaux dans bash mais jamais moi-même. La référence bash sur les tableaux (https://www.gnu.org/software/bash/manual/bash.html#Arrays) semble indiquer que l'utilisation de tableaux est très facile. Vous pouvez simplement introduire une variable d'index et l'incrémenter chaque fois que vous avez enregistré quelque chose dans le tableau: '((i ++)); echo $! > array [i] Pour tuer tous les processus avec les identifiants dans le tableau, vous pouvez utiliser une boucle for où vous décrémentez i jusqu'à ce qu'il soit de nouveau zéro et lancez un kill sur chaque pid trouvé. Veuillez noter que je n'ai pas testé ce code. – kay

+0

Ok. Merci. Je vais vérifier ça –

1

Vous devez ajouter ce genre de « tuer » que vous voulez .. tels que: kill -9 $(cat .pids.txt)

2

je préfère grep pour le processus et tuer le processus en gardant à la place les dans un fichier PID.

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

Je suppose deuxième colonne de sortie est ps -ef PID du processus lite-server dans le serveur.