dimanche 6 mai 2007

Licence to kill

Hi Folks !

Apple est une compagnie formidable qui a très largement favorisé l'existence et la persistence de couples mixtes en proposant des ordinateurs et des systèmes d'exploitation qui peuvent séduire en même temps les geeks et les non-geeks :
  • d'un côté, un système de type Unix, avec tout ce que cela implique en terme de contrôles sur le système, d'outils de développement et de stabilité de l'OS. Bref la possibilité de mettre les mains dans le cambouis quand on le souhaite, donc un système idéal pour un geek.
  • de l'autre côté, un système transparent, esthétique et stable qui prend l'utilisateur par la main si nécessaire. Bref, un système idéal pour ceux qui n'ont pas envie de se prendre la tête avec une machine.
Ainsi, quand un couple mixte (Geek / Non Geek... non mais je dis cela car j'en ai vu deux dans le fond - ouaih c'est de vous 2 là-bas dont je parle - qui ne suivent pas) se retrouve devant la nécessité d'acheter un ordinateur commun, no problemo, il existe une solution qui mettra tout le monde d'accord ! Elle est pas belle la vie !

Et cerise sur le gâteau, c'est l'occasion pour le geek d'initier en douceur sa chère et tendre aux subtilités et aux joies de la ligne de commande ! Yeh Groovy Baby ! :-)

Joignons le geste à la parole ! Profitons en pour introduire quelques commandes Unix. Aujourd'hui voyons une commande fort utile pour calmer des programmes récalcitrants (et oui même sur Mac cela arrive !) qui refusent de s'arrêter : kill

La commande kill permet d'arrêter une application (sous Unix on parle en fait de processus, qui correspond à un programme en cours d'exécution... on notera au passage que quand on parle d'exécuter un programme on ne parle pas de le tuer ou de le supprimer mais bien de "lancer", de le faire "tourner"... les informaticiens ont vraiment une langue à part ! ).

Tout d'abord il vous faut lancer un Terminal (application qui se trouve sous Applications > Utilitaires). Vous devriez avoir une fenêtre qui ressemble à peu de chose près à ça :


Avant de parler de la commande kill un peu plus en détail, une autre commande indispensable : man. La commande man (man pour manual) permet d'obtenir toutes les informations sur une commande quelconque. Il suffit pour se faire de taper
man <commande>
<commande> correspondant bien sûr à la commande à propos de laquelle vous souhaitez obtenir des informations. Par exemple, vous pouvez essayer :
man man
pour avoir les détails sur la commande man ; ou bien encore, vous pouvez essayer :
man kill
pour vous déplacer dans l'explication vous pouvez utiliser les flèches du clavier, la barre d'espace (pour vous déplacer d'une page du manuel à la fois) ou le retour chariot. Pour sortir de la page du manuel il suffit de taper 'q'. Bon, comme vous pouvez le découvrir c'est en anglais et c'est plutôt des explications techniques un peu arides... si c'était trop simple à utiliser, l'informatique ne serait plus un métier ;-) : il faut bien que les Geeks informaticiens aient des compétences à vendre pour gagner honnêtement leur vie !

Bon revenons en à notre commande kill. Notre objectif est d'arrêter une application qui refuse de s'arrêter normalement. Comme ecrit un peu plus haut, une application pour le système est associé à un processus, qui correspond à l'application, au programme en train de s'exécuter. Mac OS X comme tout Unix qui se respecte affecte un numéro de processus dit PID (Process IDentification) à chaque processus. Dans son utilisation la plus standard, il faut fournir 2 éléments à la commande kill : la puissance de l'attaque destinée à arrêter le processus et l'identifiant de ce processus (son PID). La puissance de l'attaque est donné par un tiret suivi d'un chiffre, par exemple la force de frappe classiquement utilisé est -9 qui normalement suffit à arrêter n'importe quel processus pris de folie soudaine... le -11 plus puissant encore est vraiment à réserver au situation desespérée (c'est un peu l'équivalent d'une attaque nucléaire...mais bon sans les effets de bords - c'est-à-dire ce qu'on appelle dommages collatéraux dans le monde réel et cruel de la vraie vie physique ! - comme on dit en informatique). Maintenant, il nous reste à savoir comment connaître le PID d'un processus. Ce qui nous amène à une nouvelle commande : ps (pour processes).

Si vous tapez juste ps vous n'obtiendrez pas grand chose :


La commande ne liste qu'un seul processus correspondant au shell lui-même (bash qui signifie Bourne again shell)... en réalité, la commande ps est loin de nous avoir affiché tous les processus en train de s'exécuter sur la machine. Si l'application que nous souhaitons arrêter est une application qui a été lancée par vous... hum me direz-vous, par qui d'autre une application a-t-elle pu être lancée ? eh bien par le système lui-même et sous Unix, si vous n'avez pas des droits de Super-utilisateur (on parle aussi de Root dans le vocabulaire informaticien) qui est un utilisateur ayant des droits étendus sur ce qu'il est possible de faire sur la machine... en général le Root est quelqu'un qui s'y connait et sait ce qu'il fait... nombreux sont les jeunes Geek qui aspirent à devenir un jour Root... enfin, c'est une autre histoire qui sera peut-être abordé dans un futur billet de ce blog... enfin, revenons-en à nos processus... concrètement si nous sommes un utilisateur normal nous ne pouvons que killer nos propres processus et non ceux du système. Cela permet d'éviter les grosses bêtises. Cela signifie aussi que si le processus qui est parti en live et que vous souhaitez arrêter est un processus système et que vous n'êtes qu'un utilisateur normal vous ne pourrez pas l'arrêter via un kill... il faut quand même savoir que la plupart du temps si c'est un gentil vendeur qui vous a configuré votre machine et a créé un seul utilisateur, il a dû créer un utilisateur de type root que vous puissiez facilement créer de nouveau utilisateur et installer des logiciels...

revenons à notre commande ps ; si vous souhaitez afficher tous les processus vous appartenant, vous allez taper la commande ps avec les paramètres suivants :
ps -ux -U <logname>
<logname> est le nom utilisé pour vous connecter sur votre session... si un seul utilisateur a été créé, à chaque fois que vous allumez votre machine une session pour cet utilisateur est directement ouverte : le <logname> est le nom associé à l'icone de la petite maison sous le Finder. Si vous voulez connaître votre nom d'utilisateur à la mode Geek vous pouvez taper sous le shell (attention à respecter la casse des caractères) :
echo $LOGNAME
vous connaîtrez ainsi votre nom d'utilisateur... hum, il y a même ici moyen de faire mumuse en combinant tout cela. Vous pouvez directement taper ce qui suit, ce qui devrait vous permettre de lister l'ensemble des processus vous appartenant :
ps -ux -U `echo $LOGNAME`
la partie -ux permet d'indiquer que l'on souhaite avoir différentes informations sur chacun des processus (dont notamment le PID dont nous avons besoin) et que nous souhaitons avoir la liste de tous les processus, y compris ceux qui n'ont pas été lancé depuis un shell. Comme vous l'avez compris le -U permet d'indiquer que l'on ne souhaite voir que les processus associés à l'utilisateur dont le login est donné à la suite du -U.

Comme vous devez le voir sur votre terminal, les informations sur chaque processus apparaissent sous une forme tabulaire, le PID étant renseigné dans la seconde colonne. La dernière colonne (colonne COMMAND) vous indique à quelle application correspond le processus en question. Normalement cela doit vous suffire pour trouver l'application récalcitrante que vous voulez arrêter, récupérer son PID et fort de ce petit numéro de l'arrêter. Par exemple, considérons que vous voulez arrêter l'application dont le PID est 352. Vous taperez alors ce qui suit :
kill -9 352
Et normalement cela devrait le calmer le méchant processus.

C'est bien bon tout cela mon bon geek mais elle n'est pas simple la commande pour lister tous mes processus... certes oui... ce qui serait cool c'est de pouvoir définir cette commande une fois et la réutiliser. On va donc créer ce qu'on nomme un alias, c'est-à-dire un nom associé à une commande. Si vous tapez la commande alias seul, vous verrez apparaître la liste des alias définis dans votre système. Il est fort probable si vous n'en avez jamais définis auparavant ou si personne n'a jamais toucher à rien sur votre sysème à ce niveau qu'il n'y en ait aucun.
Sous bash, pour définir un alias nous allons procéder de la sorte, par exemple pour définir avoir une liste de processus comme nous le souhaitons :

alias myps="ps -ux -U `echo $LOGNAME`"

si vous tapez par la suite la commande alias vous devrez avoir myps qui apparait. De plus, si vous tapez myps, vous obtiendrez la liste des processus exactement comme si vous aviez taper la commande ps -ux -U `echo $LOGNAME`. Il y a quand même un petit hic : dès que vous fermerez votre shell, la définition de l'alias sera perdu. Pour pallier ce problème, il va falloir créer ou modifier le fichier .bash_profile dans votre répertoire utilisateur par défaut (celui dans lequel vous êtes placés par défaut lorsque vous lancez un shell). Si vous n'avez pas de véritable éditeur de texte (c'est-à-dire quelque chose qui vous permettra de sauvegarder dans un format texte et non en RTF comme par exemple avec TextEdit ou OpenOffice... il vous faudrait quelque chose comme Komodo Edit, GVIM ou tout autre editeur de texte de votre choix... bien sûr vous en avez un en ligne de commande, pico, mais bon c'est pas la panacée ergonomique), le plus facile sera de taper les 2 lignes suivantes :
echo >> .bash_profile
echo 'alias myps="ps -ux -U `echo $LOGNAME`"' >> .bash_profile
Cela devrait vous créez un fichier .bash_profile ou concaténer à la suite de l'existant la ligne de commande permettant de créer l'alias. Sinon, vous ouvrez avec un éditeur de texte le fichier .bash_profile ou vous en créez un dans le répertoire utilisateur.

Pour vérifier que cela à fonctionner, fermez votre shell, quitter le terminal et relancer le. Normalement, quand vous taperez la commande alias, le nouvel alias défini doit apparaître.

That's all folks !
J'espère que cela vous a plu ou du moins intéressé !
N'hésitez pas à me faire des retours sur ce billet, si vous ne le trouvez pas assez clair ou autre.

En attendant, que le Groove soit avec vous !
Yeh Groovy Baby !

Aucun commentaire: