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.
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).
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
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
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.
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,% 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}\) ")
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.