12 février 2014

Application ne répondant pas

1. Mode débogage

Si une application ne répond pas, elle peut attendre par exemple une connexion réseau. Vous pouvez rattacher la commande strace à ce processus.
Syntaxe
strace <programme>
Option nécessaire :
Option courte
Description
-p <pid>
Trace le processus mentionné par son PID.
Exemple avec Debian
Pour tracer le processus de Apache 2, il faut connaître son PID :
# pidof apache2  
2533 2532 2530 2527 
Apache retourne plusieurs PID. Prenez la dernière valeur :
# strace -p 2527  
Process 2527 attached - interrupt to quit  
select(0, NULL, NULL, NULL, {0, 913609}) = 0 (Timeout)  
wait4(-1, 0x7fff798e74cc, WNOHANG|WSTOPPED, NULL) = 0  
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)  
wait4(-1, 0x7fff798e74cc, WNOHANG|WSTOPPED, NULL) = 0  
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)  
wait4(-1, 0x7fff798e74cc, WNOHANG|WSTOPPED, NULL) = 0  
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout)  
wait4(-1, 0x7fff798e74cc, WNOHANG|WSTOPPED, NULL) = 0  
select(0, NULL, NULL, NULL, {1, 0})     = 0 (Timeout) 
                                  ...
Faites [CTRL]+C pour interrompre.

2. Terminer un processus

Vous pouvez demander au système d’exploitation de terminer un processus ayant un comportement anormal ou qui est planté en invoquant son identifiant de processus (PID) ou bien son nom.

a. Rechercher un PID

Vous pouvez rechercher le PID d’une application qui ne répond plus avec les commandes suivantes :
  • pidof
  • pgrep
  • ps
pidof
Cette commande affiche le ou les PID du programme invoqué.
Syntaxe
pidof <option> <nom_du_programme
Option utile :
Option courte
Description
-s
Renvoie un seul PID.
Exemple
Connaître les PID du programme ssh :
# pidof sshd 
3610 3605 3423 
pgrep
La commande pgrep affiche les identifiants des processus.
Syntaxe
pgrep <options> <nom_du_programme>
Options nécessaires :
Option
Description
courte
longue
-l
--list-name
Affiche le processus avec son PID.
-u <utilisateur>
--euid <utilisateur>
Affiche les processus de l’UID mentionné.
Exemple
Connaître le PID du programme sshd :
# pgrep -l sshd  
3423 sshd  
3605 sshd  
3610 sshd 
Connaître le PID des programmes dont le propriétaire est root :
# pgrep -lu root  
1 init  
2 kthreadd  
3 ksoftirqd/0  
5 kworker/u:0  
6 migration/0  
7 watchdog/0  
8 migration/1  
10 ksoftirqd/1  
12 watchdog/1  
13 cpuset  
14 khelper  
15 kdevtmpfs  
                               ...
ps
ps permet d’afficher l’état des processus en cours.
Syntaxe
ps <options>
Options nécessaires :
Option courte
Description
-a
Affiche tous les processus.
-u
Affiche le nom de l’utilisateur et l’heure de lancement.
-x
Affiche également les processus qui n’ont pas de terminal de contrôle.
Exemple
Connaître uniquement le PID du programme sshd :
# ps aux |grep sshd  
root      3423  0.0  0.2  49848  1200 ?        Ss   11:10   
0:00 /usr/sbin/sshd  
root      3605  0.0  0.7  92112  3960 ?        Ss   11:10   0:00  
sshd: bob [priv]  
bob       3610  0.0  0.3  92112  1904 ?        S    11:10   0:00  
sshd: bob@pts/0   
root      3847  0.0  0.1   7848   884 pts/0    S+   11:22   0:00  
grep sshd 
Vous pouvez ajouter grep -v grep pour exclure le processus grep sshd :
# ps aux |grep sshd |grep -v grep  
root      3423  0.0  0.2  49848  1200 ?        Ss   11:10    
0:00 /usr/sbin/sshd  
root      3605  0.0  0.7  92112  3960 ?        Ss   11:10   0:00  
sshd: bob [priv]  
bob       3610  0.0  0.3  92112  1904 ?        S    11:10   0:00  
sshd: bob@pts/0

b. Outils pour terminer un processus

Si un programme ne répond plus du tout, il est donc nécessaire d’envoyer un signal au système d’exploitation pour demander de terminer son exécution. Pour effectuer cette opération, vous disposez de plusieurs commandes :
  • kill
  • pkill
  • killall
  • xkill
kill
kill permet d’envoyer différents types de signaux.
Syntaxe
kill <signal> <pid>
Les signaux utiles :
Signal
Description
-2 (SIGINT)
Interrompt le processus. [Ctrl]+C utilise ce signal.
-15 (SIGTERM)
Termine le processus.
-9 (SIGKILL)
Contrairement à SIGINT et SIGTERM, le signal ne pourra pas être ignoré par le processus.
Pour connaître la liste de tous les signaux disponibles :
# kill -l  
 1) SIGHUP         2) SIGINT          3) SIGQUIT 
 4) SIGILL         5) SIGTRAP         6) SIGABRT 
 7) SIGBUS         8) SIGFPE          9) SIGKILL 
10) SIGUSR1       11) SIGSEGV        12) SIGUSR2 
13) SIGPIPE       14) SIGALRM        15) SIGTERM 
16) SIGSTKFLT     17) SIGCHLD        18) SIGCONT 
19) SIGSTOP       20) SIGTSTP        21) SIGTTIN 
22) SIGTTOU       23) SIGURG         24) SIGXCPU 
25) SIGXFSZ       26) SIGVTALRM      27) SIGPROF 
28) SIGWINCH      29) SIGIO          30) SIGPWR 
31) SIGSYS        34) SIGRTMIN       35) SIGRTMIN+1 
36) SIGRTMIN+2    37) SIGRTMIN+3     38) SIGRTMIN+4 
39) SIGRTMIN+5    40) SIGRTMIN+6     41) SIGRTMIN+7 
42) SIGRTMIN+8    43) SIGRTMIN+9     44) SIGRTMIN+10 
45) SIGRTMIN+11   46) SIGRTMIN+12    47) SIGRTMIN+13  
48) SIGRTMIN+14   49) SIGRTMIN+15    50) SIGRTMAX-14 
51) SIGRTMAX-13   52) SIGRTMAX-12    53) SIGRTMAX-11 
54) SIGRTMAX-10   55) SIGRTMAX-9     56) SIGRTMAX-8 
57) SIGRTMAX-7    58) SIGRTMAX-6     59) SIGRTMAX-5 
60) SIGRTMAX-4    61) SIGRTMAX-3     62) SIGRTMAX-2 
63) SIGRTMAX-1    64) SIGRTMAX
Exemple
Pour terminer le programme Apache 2 proprement, vous devez utiliser le signal SIGTERM :
# kill -15 $(pidof apache2)
Si la demande SIGTERM n’aboutit pas, il est nécessaire d’envoyer le signal SIGKILL :
# kill -9 $(pidof apache2)
pkill
pkill envoie également un signal à un processus.
Syntaxe
pkill <options> <nom_du_programme>
Options utiles :
Option
Description
courte
longue
-l
--list-name
Affiche le processus avec son PID.
-u <utilisateur>
--euid <utilisateur>
Affiche les processus de l’UID mentionné.
-P
--parent
Sélectionne les processus du parent PID (PPID).
Exemple
Listez les processus d’Apache 2 pour constater s’il est en cours d’exécution :
# pidof apache2  
4687 4686 4684 4681 
Terminer les processus associés à Apache 2 :
# pkill apache2
Vous n’avez pas à connaître le PID du processus contrairement à la commande kill.
Vérifiez le résultat :
# pidof apache2
killall
killall termine un processus en invoquant son nom. Par défaut, il envoie le signal SIGTERM (-15).
Syntaxe
killall <options> <processus>
Options utiles :
Option
Description
courte
longue
-l
--list
Liste les signaux disponibles.
-s
--signal
Envoie un signal spécifique
-u
--user
Termine les processus de l’utilisateur mentionné.
Exemple
Listez les processus d’Apache 2 pour savoir s’il est en cours d’exécution :
# pidof apache2  
4687 4686 4684 4681 
Terminez avec le signal SIGKILL (-9) les processus associés à Apache 2 :
# killall -s 9 apache2
Vous n’avez pas à connaître le PID du processus contrairement à la commande kill.
Vérifiez le résultat :
# pidof apache2
xkill
Cet outil est utile lorsque vous avez un environnement graphique. Xkill demande au serveur X de clore la connexion avec le client X. Il permet de terminer un processus généralement planté qui est exécuté dans une fenêtre à l’écran sur le bureau.
Syntaxe
xkill
Pas d’options pour cette commande.
Exemple
Vous avez une application telle que LibreOffice sur le bureau. Pour utiliser xkill, ouvrez un terminal sans être obligatoirement root. Et, vous tapez xkill :
images/10EI07.png
Vous déplacez la souris sur la fenêtre de LibreOffice et vous cliquez :
images/10EI08.png
La fenêtre sur laquelle vous avez cliqué disparaît. Le ou les processus sont alors terminés.

Aucun commentaire :

Enregistrer un commentaire