Un problème est que la ligne de commande qui invoque le script a le nom du processus que vous interrogez ensuite, à dessein ; donc une chose trouvée sera le script lui-même.
On peut s'en prémunir, mais pourquoi aller jusqu'au système avec ce gros pipeline ?
Interroger le processus en Perl, par exemple avec Proc::ProcessTable
use warnings;
use strict;
use Proc::ProcessTable;
my $proc_name = shift // die "Usage: $0 process-name\n"; #/
my $pid;
my $pt = Proc::ProcessTable->new();
foreach my $proc (@{$pt->table}) {
next if $proc->cmndline =~ /$0.*$proc_name/; # not this script
if ($proc->cmndline =~ /\Q$proc_name/) {
$pid = $proc->pid;
last;
}
}
kill 9, $pid; # must it be 9 (SIGKILL)?
my $gone_pid = waitpid $pid, 0; # then check that it's gone
Notez qu'il est bien plus agréable de "tuer" un processus en lui envoyant SIGTERM
(généralement 15), et non SIGKILL
.
La recherche d'un "nom" de processus peut être périlleuse car il existe de nombreux processus avec de longues lignes de commande fonctionnant sur un système moderne qui peuvent contenir ce mot. Le code utilise votre exigence, de simplement interroger par le nom soumis, mais je recommande de renforcer cela avec des vérifications supplémentaires.
Pour de nombreux détails de processus que le module peut interroger, voir sa page module de raccordement .
Même si vous préférez analyser la table de processus vous-même, je n'obtiendrais que ps -ef
et ensuite l'analyser dans le script. Cela donne beaucoup plus de flexibilité pour s'assurer que vous terminez vraiment ce que vous voulez.