web-dev-qa-db-fra.com

Comment définir le nom de processus d'un script shell?

Est-il possible de définir le nom de processus d'un script Shell? Ceci est nécessaire pour tuer ce script avec la commande killall.

22
dan

Voici une façon de le faire, c'est une solution de contournement mais ça fonctionne plutôt bien. N'hésitez pas à le modifier selon vos besoins, il faudra certainement vérifier la création du lien symbolique ou utiliser un dossier tmp pour éviter d'éventuelles conditions de concurrence (si elles sont problématiques dans votre cas).

Manifestation

wrapper

#!/bin/bash
script="./dummy"
newname="./killme"

rm -iv "$newname"

ln -s "$script" "$newname"

exec "$newname" "$@"

dummy

#!/bin/bash
echo "I am $0"
echo "my params: $@"

ps aux | grep bash

echo "sleeping 10s... Kill me!"
sleep 10

Testez-le avec:

chmod +x dummy wrapper
./wrapper some params

Dans un autre terminal, tuez-le en utilisant:

killall killme

Remarques

Assurez-vous que vous pouvez écrire dans votre dossier actuel (répertoire de travail actuel).

Si votre commande actuelle est:

/path/to/file -q --params somefile1 somefile2

Définissez la variable script dans wrapper sur/chemin/vers/fichier (au lieu de ./dummy ) et appelez wrapper comme ceci:

./wrapper -q --params somefile1 somefile2
21
Weboide

Vous ne pouvez pas le faire de manière fiable et portable, à ma connaissance. Sur certaines versions d'Unix, changer le contenu d'argv [0] fera l'affaire. Je ne crois pas qu'il y ait un moyen de faire cela dans la plupart des coquillages, cependant.

Voici quelques références sur le sujet.

2
Brian Clapper

Vous pouvez utiliser la commande kill sur un PID pour pouvoir exécuter quelque chose en arrière-plan, obtenir son ID et le tuer.

Le PID du dernier travail exécuté en arrière-plan peut être obtenu à l'aide de $!.

echo test & echo $!

1
Abs

% 1,% 2 ... font aussi un travail adéquat:

#!/bin/bash
# set -ex

sleep 101 &
FIRSTPID=$!
sleep 102 &
SECONDPID=$!

echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")
kill %2
echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")
sleep 1
kill %1
echo $(ps ax|grep "^\(${FIRSTPID}\|${SECONDPID}\) ")
0
slaxor

Sous Linux au moins, killall dvb fonctionne même si dvb est un script Shell portant la mention #!. La seule astuce consiste à rendre le script exécutable et à l'invoquer par son nom, par exemple,

dvb watch abc write game7 from 9pm for 3:30

Lancer ps montre un processus nommé

/usr/bin/lua5.1 dvb watch ...

mais killall dvb l'enlève.

0
Norman Ramsey