OVH Cloud OVH Cloud

tuer une tache

13 réponses
Avatar
fembe
bonjour ,
je n'y connais vraiment rien aux shells mais j'aimerai faire une procedure
qui teste si un process existe puis le tuer .
Apres avoir fait ps aux|grep proc_a_tuer
comment savoir si le process existe et comment récupérer l'id ?

10 réponses

1 2
Avatar
R12y
On Mon, 10 Apr 2006 17:06:40 +0000, fembe wrote:

bonjour ,
je n'y connais vraiment rien aux shells mais j'aimerai faire une procedure
qui teste si un process existe puis le tuer .
Apres avoir fait ps aux|grep proc_a_tuer
comment savoir si le process existe et comment récupérer l'id ?


Avec pgrep.
Par exemple pour récupérer les ID des processes dont le nom contien
"firefox", alors c'est:

# pgrep firefox

Comme j'ai plein de firefox allumés, alors j'ai le résultat sur plusieurs
lignes (un PID par ligne).

C'est à toi de faire une boucle while ou for pour gérer la chose, en
fonction du shell que tu utilise.

--
Debian/apt Repo: http://locataire-serveur.info/sections/liens/debian-repository
Fedora/yum Repo: http://locataire-serveur.info/sections/liens/fedora-core-yum

Avatar
Pascal Bourguignon
fembe writes:
je n'y connais vraiment rien aux shells mais j'aimerai faire une procedure
qui teste si un process existe puis le tuer .
Apres avoir fait ps aux|grep proc_a_tuer
comment savoir si le process existe et comment récupérer l'id ?


D'abord, il faut bien se rendre compte qu'entre le moment où on trouve
le pid d'un processus, et le moment où on le tue, ce processus peut
trés bien se terminer et un autre prendre sa place. (Improbable, mais
possible, sur une marchine surchargée par exemple).

La seule manière d'envoyer un signal à un processus en étant sûr de
l'identité du processus, AMC, est d'avoir un pipe ouvert avec ce
processus, et de le fermer. Alors lorsque ce processus effectuera un
read sur ce pipe, il recevra un SIGPIPE, ce qui peut le tuer s'il
s'est configuré ansi.

Ensuite, il faut faire attention comment on défini "proc_a_tuer" pour
grep.

$ ps aux|grep bash
root 5723 0.0 0.1 4720 1724 tty1 S 04:27 0:00 -bash
root 5829 0.0 0.1 4720 1712 tty2 S 04:28 0:00 -bash
pjb 6359 0.0 0.1 4800 1824 pts/1 S 04:29 0:00 -bash
pjb 9617 0.0 0.1 4796 1784 pts/2 S 04:34 0:00 -bash
root 9687 0.0 0.1 4756 1744 pts/2 S 04:34 0:00 -bash
pjb 12227 0.0 0.1 4680 1544 pts/3 S 04:50 0:00 /bin/bash --noedi
pjb 12359 0.0 0.1 4676 1532 pts/5 S 17:09 0:00 /bin/bash --noedi
pjb 12457 0.0 0.0 4676 552 pts/5 S 17:10 0:00 /bin/bash --noedi
pjb 12458 0.0 0.0 3484 456 pts/5 S 17:10 0:00 cat /bin/bash
pjb 12459 0.0 0.0 4676 780 pts/5 S 17:10 0:00 /bin/bash --noedi
pjb 12472 0.0 0.0 3612 608 pts/5 R 17:10 0:00 grep bash
$

On obtient de toutes sortes de processus:
- des processus nous appartenant éxecutant un fichier nommé "bash";
- des processus ne nous appartenant pas éxecutant un fichier nommé "bash";
- des processus utilisant un fichier nommé "bash";
- le processus grep lui-même;
- etc.

C'est un peu le bordel.

Pour le processus grep lui-même, il y a un truc qui permet de
l'éviter: utiliser une regexp qui ne se reconnait pas elle-même.

ps aux|grep -e '[b]ash'

par exemple.


Pour éviter les processus utilisant un fichier de même nom, on peut
utiliser killproc(8), auquel on passe le chemin absolu de
l'exécutable, mais ça n'aide pas pour les processus multiple.

Noter ce "BUG" de killproc:

Identifying a process based on the executable file and the corre­
sponding inode number only works if the process stays alive dur­
ing killproc's execution. Impure executables like shell scripts
(the inode number of the shell is not identical to that of the
script) and programs rewriting their zeroth argument may not be
identified by a file name.



Enfin, à défaut de killproc, on peut y aller bourrin et tout tuer:

kill $(ps aux|awk '/[b]ash/{print $2}')

(ou bien, lire man cut, et utiliser grep et cut à la place de awk).



--
__Pascal Bourguignon__ http://www.informatimago.com/
Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we. -- Georges W. Bush

Avatar
JustMe
R12y avait écrit le 10/04/2006 :
On Mon, 10 Apr 2006 17:06:40 +0000, fembe wrote:

bonjour ,
je n'y connais vraiment rien aux shells mais j'aimerai faire une procedure
qui teste si un process existe puis le tuer .
Apres avoir fait ps aux|grep proc_a_tuer
comment savoir si le process existe et comment récupérer l'id ?


Avec pgrep.
Par exemple pour récupérer les ID des processes dont le nom contien
"firefox", alors c'est:

# pgrep firefox

Comme j'ai plein de firefox allumés, alors j'ai le résultat sur plusieurs
lignes (un PID par ligne).

C'est à toi de faire une boucle while ou for pour gérer la chose, en
fonction du shell que tu utilise.


killall firefox

:-D


Avatar
Damien Wyart
* R12y in fr.comp.os.unix:
Avec pgrep.
Par exemple pour récupérer les ID des processes dont le nom contien
"firefox", alors c'est:

# pgrep firefox

Comme j'ai plein de firefox allumés, alors j'ai le résultat sur
^^^^^^^

Firefox = sapin de Noël ?? ;-)

plusieurs lignes (un PID par ligne).

C'est à toi de faire une boucle while ou for pour gérer la chose, en
fonction du shell que tu utilise.


Ou utiliser pkill, un copain de pgrep...

--
DW

Avatar
Jacques L'helgoualc'h
Le 10-04-2006, Pascal Bourguignon a écrit :
[...]
Enfin, à défaut de killproc, on peut y aller bourrin et tout tuer:

kill $(ps aux|awk '/[b]ash/{print $2}')

(ou bien, lire man cut, et utiliser grep et cut à la place de awk).


Un truc comme

awk '$11 ~ /(^|[-/])bash$/{print $2}'

est moins bourrin...
--
Jacques L'helgoualc'h

Avatar
Stephane Chazelas
On Mon, 10 Apr 2006 17:17:50 +0200, Pascal Bourguignon wrote:
fembe writes:
je n'y connais vraiment rien aux shells mais j'aimerai faire une procedure
qui teste si un process existe puis le tuer .
Apres avoir fait ps aux|grep proc_a_tuer
comment savoir si le process existe et comment récupérer l'id ?


D'abord, il faut bien se rendre compte qu'entre le moment où on trouve
le pid d'un processus, et le moment où on le tue, ce processus peut
trés bien se terminer et un autre prendre sa place. (Improbable, mais
possible, sur une marchine surchargée par exemple).

La seule manière d'envoyer un signal à un processus en étant sûr de
l'identité du processus, AMC, est d'avoir un pipe ouvert avec ce
processus, et de le fermer. Alors lorsque ce processus effectuera un
read sur ce pipe, il recevra un SIGPIPE, ce qui peut le tuer s'il
s'est configuré ansi.
[...]


Non, c'est quand on ecrit sur un pipe mort qu'on prend un
SIGPIPE, pas quand on lit. Quand on lit, le read() renvoie
juste le nombre d'octets qui restent dans le pipe (0 indiquant
un end-of-file s'il n'y en a plus).

En pratique, personne ne prend la peine de contourner ce
probleme tellement il est improbable. Meme les outils standards
qui se basent sur /var/run/<whatever>.pid et pkill/killall,
supposent qu'il est impossible qu'un <pid> soit reutilisé entre
l'execution d'un ps (ou un stat("/proc/<pid>/cmdline")) et le
kill(<pid>) qui vient juste apres (voir meme pour certains qu'un
<pid> soit reutilisé tout court).

--
Stephane


Avatar
totof2000
l'option -o de ps est bien pratique aussi ...
ps -e -o pid -o command
Avatar
Delf

# pgrep firefox


Ou alors, pour les warriors :

# ps -aux | grep xchat | grep -v grep | awk '{ print $2 }'

--
Delf

Avatar
Benoit Izac
Bonjour,

le 10/04/2006 à 18:18, Delf a écrit dans le message
<443a85ad$0$18280$ :


# pgrep firefox


Ou alors, pour les warriors :

# ps -aux | grep xchat | grep -v grep | awk '{ print $2 }'


ps auxwwwww | awk '/[x]chat/{print $2}'

--
Benoit Izac


Avatar
Stephane Chazelas
On Mon, 10 Apr 2006 18:39:12 +0200, Benoit Izac wrote:
Bonjour,

le 10/04/2006 à 18:18, Delf a écrit dans le message
<443a85ad$0$18280$ :


# pgrep firefox


Ou alors, pour les warriors :

# ps -aux | grep xchat | grep -v grep | awk '{ print $2 }'


ps auxwwwww | awk '/[x]chat/{print $2}'


POSIX:

ps -eo pid= -o comm= | awk '$2 == "xchat" {print $1}'

Linux, HPUX:

ps -eo pid= -C xchat

Linux:

pidof xchat

Linux (recents), Solaris 8+, FreeBSD.

pgrep -x xchat

Partout où lsof est installé:

lsof -t -c xchat

etc.

--
Stephane



1 2