<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"/usr/local/share/xml/docbook/4.2/docbookx.dtd" [
<!ENTITY ie "<abbrev>i.e.</abbrev>">
<!ENTITY cf "<abbrev>c.f.</abbrev>">
<!ENTITY todo "<command>--- T O  D O :</command>">
<!ENTITY unix "<emphasis>Unix</emphasis>">
<!ENTITY bsd "<emphasis>BSD</emphasis>">
<!ENTITY xbsd "<emphasis>xBSD</emphasis>">
<!ENTITY fbsd "<emphasis>FreeBSD</emphasis>">
<!ENTITY obsd "<emphasis>OpenBSD</emphasis>">
<!ENTITY sysV "<emphasis>System V</emphasis>">
<!ENTITY linux "<emphasis>Linux</emphasis>">
<!ENTITY glinux "<emphasis>GNU/Linux</emphasis>">
<!ENTITY deb "<emphasis>Debian</emphasis>">
<!ENTITY fpasswd "<filename>/etc/passwd</filename>">
<!ENTITY fgroup "<filename>/etc/group</filename>">
<!ENTITY mpasswd "<filename>/etc/master.passwd</filename>">
<!ENTITY fshadow "<filename>/etc/shadow</filename>">
<!ENTITY gshadow "<filename>/etc/gshadow</filename>">
<!ENTITY logindef "">
<!ENTITY loginconf "">
<!ENTITY liloconf "">
<!ENTITY inittab "">
<!ENTITY S20ssh "">
<!ENTITY rcconf "">
<!ENTITY syslogconf "">
<!ENTITY _aut_Pre "<firstname>Pascal</firstname>">
<!ENTITY _aut_Nom "<surname>Picard</surname>">
<!ENTITY _aut_eMail "<email>pascal@seth.homeunix.net</email>">
<!ENTITY _aut_Init "<authorinitials>P.P.</authorinitials>">
<!ENTITY _affiliat "<affiliation><orgname>Corto E.T.F., K&amp;M</orgname><address>Sainte-Clotilde, Ile de la R&#233;union</address></affiliation>">
<!ENTITY _holder "<holder>Pascal PICARD, <emphasis>pascal@seth.homeunix.net</emphasis></holder>">
]>
<article class="techreport" lang="fr" revisionflag="changed">
  <articleinfo>
    <author>
      <firstname>Pascal</firstname>

      <surname>Picard</surname>

      <affiliation>
        <orgname>Corto E.T.F., K&amp;M</orgname>

        <address>Sainte-Clotilde, Ile de la Réunion</address>
      </affiliation>
    </author>

    <author>
      <firstname>Ivan Kurzweg</firstname>

      <affiliation>
        <orgname>Fremens Inst.</orgname>

        <address>La Possession, Ile de la Réunion</address>
      </affiliation>
    </author>

    <date>Last Updated: 2006/04/09</date>

    <authorinitials>P.P.</authorinitials>

    <title>Gestion des processus</title>

    <copyright>
      <year>2002-2005, 2006</year>

      <holder>Pascal PICARD,
      <emphasis>pascal@seth.homeunix.net</emphasis></holder>
    </copyright>

    <legalnotice>
      <para>Permission to use, copy, modify, and distribute this documentation
      for any purpose with or without fee is here by granted, provided that
      the above copyright notice and this permission notice appear in all
      copies.</para>

      <para>THE DOCUMENTATION IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
      WARRANTIES WITH REGARD TO THIS DOCUMENTATION INCLUDING ALL IMPLIED
      WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
      BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR
      ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
      WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
      ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
      DOCUMENTATION.</para>
    </legalnotice>

    <keywordset>
      <keyword>processus, jobs, fg, bg, &amp;</keyword>
    </keywordset>
  </articleinfo>

  <abstract>
    <para>Dans cette partie nous nous intéressons à la gestion des processus
    en rappelant cette notion système fondamentale. Nous étudions ensuite les
    principales commandes de gestion de ces processus.</para>

    <para>Pour nous joindre : <email></email></para>

    <para><email>pascal@seth.homeunix.net </email></para>

    <para><email>ik-r@wanadoo.fr</email></para>
  </abstract>

  <!-- Partie 2 : Processus -->

  <sect1>
    <title>Notion de processus</title>

    <para>Un processus, au sens d'un système d'exploitation est une unité
    logique en cours d'exécution ou susceptible de s'exécuter. De manière
    informelle, on dit qu'un processus est l'instance d'un programme en cours
    d'exécution. Durant tout son cycle de vie, qui le fait transiter par
    différents états (en exécution, endormi, éligible, préempté ...), le
    processus est identifié de manière unique au moyen d'un entier non signé
    appelé pid [<foreignphrase>Process IDentifier</foreignphrase>].</para>

    <para>Un processus peut donner naissance à un nouveau processus par
    duplication de son contexte au moyen d'un appel système
    <command>fork</command> (<abbrev>c.f.</abbrev> <command>man 2
    fork</command>). Cette fonction retourne deux valeurs, l'une dans le
    contexte du père ou elle désigne le <emphasis>pid</emphasis> du fils
    (nouvellement créé) et l'autre dans le contexte du fils (valeur égale à
    0). Le processus fils partage toutes les ressources du père telles que les
    descripteurs de fichiers, les différents statuts de gestion des signaux,
    l'organisation de la mémoire. Dans la plupart des cas le processus fils
    est créé dans le but de charger et d'exécuter un programme différent. Le
    processus fils se recouvre lui-meme avec l'image mémoire du nouveau
    programme en lui passant un ensemble de paramètres au moyen de l'appel
    système <command>execve</command>. Un processus se termine par l'exécution
    de l'appel système <command>exit</command> en passant un octet de statut à
    son père.</para>

    <figure id="fig1">
      <title>Cycle de vie d'un processus</title>

      <mediaobject>
        <imageobject role="fo">
          <imagedata align="center"
                     fileref="./images/figures/proc_cyclevie.eps" format="EPS"
                     scale="100" valign="middle" />
        </imageobject>

        <imageobject role="html">
          <imagedata align="center"
                     fileref="../images/figures/proc_cyclevie.png"
                     format="PNG" scale="100" valign="middle" />
        </imageobject>

        <textobject>
          <phrase>Schématisation du cyle de vie d'un processus.</phrase>
        </textobject>
      </mediaobject>
    </figure>

    <para>Un processus peut aussi communiquer avec un autre au moyen d'un
    canal de communication inter-processus tel que : <itemizedlist>
        <listitem>
          <para>tubes [<foreignphrase>pipes</foreignphrase>],</para>
        </listitem>

        <listitem>
          <para><foreignphrase>sockets</foreignphrase>,</para>
        </listitem>

        <listitem>
          <para>fichiers intermédiaires.</para>
        </listitem>
      </itemizedlist></para>

    <para>Un processus peut suspendre son exécution jusqu'à ce que tous ces
    fils se terminent au moyen de l'appel système <command>wait</command>,
    lequel renvoi le <parameter>pid</parameter> et le statut du fils terminé.
    Le processus père peut s'arranger pour recevoir une notification par un
    signal à la terminaison (correcte ou incorrecte) du processus fils.</para>

    <para>Un processus fils peut devenir orphelin si son père termine avant
    lui, auquel cas le noyau s'arrange pour le <quote>faire adopter</quote>
    par un processus système (<emphasis>INIT</emphasis>), le processus fils
    peut donc lui transmettre son statut de terminaison.</para>

    <para>L'exécution des processus est géré par un (processus)
    <emphasis>planificateur</emphasis> (ou ordonnanceur
    [<foreignphrase>scheduler</foreignphrase>]) selon la priorité attribué aux
    processus. Cette priorité est gérée par un <emphasis>algorithme
    d'ordonnancement</emphasis> [<foreignphrase>scheduling
    algorithm</foreignphrase>] du noyau.</para>
  </sect1>

  <sect1>
    <title>Principaux éléments d'un processus</title>

    <para>La plupart des éléments d'un processus (temps
    <foreignphrase>CPU</foreignphrase> consommé, fichiers ouverts et accédés,
    mémoire allouée ...) ont une influence sur son exécution. Nous abordons
    dans cette section les éléments ou paramètres les plus intéressants du
    point de vue de l'administrateur système.</para>

    <simplesect>
      <title><parameter>pid</parameter></title>

      <para>Il s'agit de l'identifiant du processus assigné par le noyau. Son
      unicité permet de repérer le processus sans ambiguïtés sur tout son
      cycle de vie. Le noyau attribue les numéros de processus dans l'ordre de
      leur apparition. Quand il a épuisé son intervalle de valeurs, il repart
      sur la borne inférieure en sautant les valeurs attribuées aux processus
      en cours.</para>
    </simplesect>

    <simplesect>
      <title><parameter>ppid</parameter></title>

      <para>C'est l'identifiant du processus père du processus courant. Un
      processus est crée par duplication du contexte d'un processus existant.
      Le processeur géniteur est dit père et le processus nouvellement créé
      est dit fils. Tout processus possède un père unique et un père peut
      avoir différents fils (arborescence de processus). Si un processus père
      vient à terminer avant son fils, ce dernier hérite d'un nouveau père le
      processsus <emphasis>INIT</emphasis>.</para>
    </simplesect>

    <simplesect>
      <title><parameter>uid</parameter> et <parameter>euid</parameter></title>

      <para>L'<parameter>uid</parameter> [<foreignphrase>user
      identifier</foreignphrase>] désigne l'idenfiant de l'utilisateur
      propriétaire du processus (<abbrev>i.e.</abbrev> l'identité de
      l'utilisateur ayant crée le processus). Plus précisément, il s'agit de
      l'<parameter>euid</parameter> [<foreignphrase>effective user
      identifier</foreignphrase>] associé au processus père du processus
      courant.</para>

      <para>L'<parameter>euid</parameter> est utilisé pour déterminer les
      ressources (mémoires, fichiers, ...) auxquelles un processus peut
      accéder. Dans la plupart des cas l'<parameter>euid</parameter> est égal
      à l'<parameter>uid</parameter>, sauf si le programme exécuté est
      <emphasis>setuid on execution</emphasis>.</para>

      <para>Conserver ces deux valeurs permet de maintenir la distinction
      entre identité et permissions, et autorise le programme
      <emphasis>setuid</emphasis> à ne pas s'éxecuter sur tout son cycle de
      vie en usant de permissions étendues, <abbrev>i.e.</abbrev>
      l'<parameter>euid</parameter> évolue en fonction des permissions
      nécessaires.</para>

      <para>Les Unices conservent en général une autre valeur appelée
      <parameter>suid</parameter> [<emphasis>save uid</emphasis>], copie de
      l'<parameter>euid</parameter> au moment du début de son exécution. Le
      programme <emphasis>setuid</emphasis> peut ainsi renoncer à ces
      privilèges d'accès durant la majeure partie de son exécution et
      retrouver ses privilèges uniquement quand cela est necéssaire. Cela rend
      le programme plus sur du point de vue sécurité.</para>
    </simplesect>

    <simplesect>
      <title><parameter>gid</parameter> et <parameter>egid</parameter></title>

      <para>Le <parameter>gid</parameter> [<foreignphrase>group
      identifier</foreignphrase>] désigne l'identifiant du groupe propriétaire
      du processus. L'<parameter>egid</parameter> [<foreignphrase>effective
      group identifier</foreignphrase>] entretient avec le
      <parameter>gid</parameter> une relation similaire à celle liant le
      couple <parameter>euid</parameter>, <parameter>uid</parameter>. Un
      processus peut appartenir à plusieurs groupes à la fois. La
      détermination des permissions d'accès dépend uniquement de
      <parameter>egid</parameter> et de la liste des groupes supplémentaires
      (stockés indépendamment de l'<parameter>egid</parameter> et du
      <parameter>gid</parameter>).</para>
    </simplesect>

    <simplesect>
      <title><parameter>niceness</parameter></title>

      <para>La priorité d'ordonnancement d'un processus est déterminée par un
      algorithme d'ordonnancement qui se base sur des paramètres tels que le
      temps <foreignphrase>CPU</foreignphrase> récemment consommé, le temps
      d'attente avant exécution et le paramètre <parameter>nice</parameter>
      adjustable par l'utilisateur. Sur les architectures
      <emphasis>BSD</emphasis> <parameter>nice</parameter> est défini dans
      l'intervalle [-20, +20] ([-20, +19] sur <emphasis>GNU</emphasis>
      <emphasis>Linux</emphasis>), une valeur négative augmente la priorité du
      processus, tandis qu'une valeur positive la diminue. Seul l'admistrateur
      est en mesure d'attribuer des valeurs négatives.</para>
    </simplesect>

    <simplesect>
      <title><parameter>Control terminal</parameter></title>

      <para>La plupart des processus possèdent un terminal de controle qui
      leur permet notamment d'ajuster leur entrée standard et leurs sorties
      standard et d'erreurs.</para>
    </simplesect>
  </sect1>

  <sect1>
    <title>Etats d'un processus</title>

    <para>A un instant donné, sur une machine mono-processeur, un seul
    processus peut être exécuté (et au plus n sur une machine à n
    processeurs). En général, le nombre <emphasis>m</emphasis> de processus
    existant est bien supérieur au nombre <emphasis>n</emphasis> de
    processeurs, par conséquent les processus possèdent plusieurs états (autre
    que l'état <quote>en exécution</quote>. Il existe fondamentalement quatre
    états d'exécution : <table>
        <title>Les principaux états d'un processus</title>

        <tgroup cols="2">
          <colspec colname="c1" colnum="1" colwidth="0.5*+1" />

          <colspec colname="c2" colnum="2" colwidth="2*+1" />

          <thead>
            <row>
              <entry align="center">Etats</entry>

              <entry align="center">Sémantique</entry>
            </row>
          </thead>

          <tbody>
            <row>
              <entry
              align="left"><foreignphrase>Runnable</foreignphrase></entry>

              <entry align="left">Prêt à s'exécuter.</entry>
            </row>

            <row>
              <entry
              align="left"><foreignphrase>Sleeping</foreignphrase></entry>

              <entry align="left">En attente d'un évènement ou d'une
              ressource.</entry>
            </row>

            <row>
              <entry
              align="left"><foreignphrase>Stopped</foreignphrase></entry>

              <entry align="left">Suspendu.</entry>
            </row>

            <row>
              <entry
              align="left"><foreignphrase>Zombie</foreignphrase></entry>

              <entry align="left">Etat terminal d'un processus.</entry>
            </row>
          </tbody>
        </tgroup>
      </table></para>

    <para>Un processus dans l'état <foreignphrase>Runnable</foreignphrase> est
    prêt à s'exécuter dès que le <emphasis>CPU</emphasis> est disponible.
    Trois cas sont possibles : </para>

    <itemizedlist>
      <listitem>
        <para>Le processus s'exécute pendant tout le
        <command>quantum</command> qui lui est alloué avant
        commutation.</para>
      </listitem>

      <listitem>
        <para>Il est <emphasis>préempté</emphasis> suite à un appel système
        (le processus demande une opération d'E/S, par exemple)</para>
      </listitem>

      <listitem>
        <para>Il termine son travail avant l'expiration de ce <command>
        quantum</command>, un autre processus est alors exécuté.</para>
      </listitem>
    </itemizedlist>

    <para>Dans les deux premiers cas il passe dans l'état
    <foreignphrase>Sleeping</foreignphrase>, tandis que dans le dernier il
    passe dans l'état <foreignphrase>Zombie</foreignphrase>, tant qu'il n'a
    pas transmis son statut de terminaison à son père.</para>

    <para>Un processus dans l'état <quote>endormi</quote>
    [<foreignphrase>Sleeping</foreignphrase>] est dans l'attente d'un
    évènement. Par exemple, fin d'une opération d'E/S, demande de connexion
    réseau à un démon. La fin de l'évènement est marqué par un signal qui
    permet au processus de redevenir élligible (état
    <foreignphrase>Runnable</foreignphrase>).</para>

    <para>L'état <foreignphrase>Stopped</foreignphrase> interdit au processus
    de s'exécuter. Un processus passe dans cet état suite à l'envoi du signal
    <emphasis>SIGSTOP</emphasis> ou par <emphasis>SIGTSTP</emphasis> (généré
    par un &lt;CTRL&gt;-Z, <abbrev>c.f.</abbrev> section <xref
    linkend="_signal" />). La reprise est assurée à la recéption du signal
    <emphasis>SIGCONT</emphasis>.</para>

    <para>L'état <foreignphrase>Zombie</foreignphrase> marque la fin de
    l'exécution d'un processus, qui n'a pas encore transmit son statut de
    terminaison à son père.</para>
  </sect1>

  <sect1 id="_signal">
    <title>Signaux</title>

    <para>Il s'agit d'un mécanisme basique de communication unidirectionnel
    avec les processus. Les différents
    <quote><foreignphrase>Unices</foreignphrase></quote> définissent près
    d'une trentaine de signaux.</para>

    <para>Les signaux peuvent être envoyé par un utilisateur par la commande
    <command>kill</command>, généré depuis un terminal pour interrompre ((ou
    terminer) &lt;CTRL&gt;-C) un processus, ou pour suspendre (&lt;CTRL&gt;-Z)
    un processus, ou envoyer par le noyau pour signaler un problème (division
    par 0, par exemple).</para>

    <para>A la réception d'un signal, un processus peut : <itemizedlist>
        <listitem>
          <para>activer un gestionnaire
          [<foreignphrase>handler</foreignphrase>] prédéfini pour traiter
          l'évènement, ou</para>
        </listitem>

        <listitem>
          <para>laisser au noyau le soin d'exécuter une action par défaut,
          laquelle dépend de la nature du signal.</para>
        </listitem>
      </itemizedlist></para>

    <para>Un processus n'est pas toujours en mesure de traiter immédiatement
    un signal quand celui-ci survient, c'est pourquoi deux mécanismes
    supplémentaires sont prévus : <itemizedlist>
        <listitem>
          <para><emphasis>ignorer</emphasis> le signal, <abbrev>i.e.</abbrev>
          ne pas en tenir compte.</para>
        </listitem>

        <listitem>
          <para><emphasis>suspendre</emphasis> ou <emphasis>bloquer</emphasis>
          le signal, <abbrev>i.e.</abbrev> le mettre en attente jusqu'à ce que
          le processus soit en mesure de le traiter. Dans ce cas le
          gestionnaire associé au signal n'est appelé qu'une seule fois, même
          si le signal a été délivré plusieurs fois pendant la durée de la
          suspension.</para>
        </listitem>
      </itemizedlist></para>

    <formalpara>
      <title>Récapitulatif des signaux de base.</title>

      <para><table>
          <title>Commandes externes</title>

          <!-- one of (graphic mediaobject tgroup) -->

          <tgroup cols="7">
            <colspec colname="c1" colnum="1" colwidth="1*+1" />

            <colspec colname="c2" colnum="2" colwidth="1*+1" />

            <colspec colname="c3" colnum="3" colwidth="1*+1" />

            <colspec colname="c4" colnum="4" colwidth="1*+1" />

            <colspec colname="c5" colnum="5" colwidth="1*+1" />

            <colspec colname="c6" colnum="6" colwidth="1*+1" />

            <colspec colname="c7" colnum="7" colwidth="1*+1" />

            <thead>
              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">n°</entry>

                <entry>nom</entry>

                <entry>description</entry>

                <entry>action par défaut</entry>

                <entry>ignorable ?</entry>

                <entry>suspendable ?</entry>

                <entry><foreignphrase>core dump ?</foreignphrase></entry>
              </row>
            </thead>

            <tbody>
              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">1</entry>

                <entry align="center"><parameter> SIGHUP </parameter></entry>

                <entry><foreignphrase>terminal line
                hangup</foreignphrase></entry>

                <entry>Terminaison</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Non</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">2</entry>

                <entry align="center"><parameter> SIGINT </parameter></entry>

                <entry><foreignphrase>interrupt
                program</foreignphrase></entry>

                <entry>Terminaison</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Non</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">3</entry>

                <entry align="center"><parameter>SIGQUIT</parameter></entry>

                <entry><foreignphrase>quit program</foreignphrase></entry>

                <entry>Terminaison</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">9</entry>

                <entry align="center"><parameter> SIGKILL </parameter></entry>

                <entry><foreignphrase>kill program</foreignphrase></entry>

                <entry>Terminaison inconditionnelle</entry>

                <entry align="center">Non</entry>

                <entry align="center">Non</entry>

                <entry align="center">Non</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">*</entry>

                <entry align="center"><parameter>SIGBUS</parameter></entry>

                <entry>bus error</entry>

                <entry>Terminaison</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">11</entry>

                <entry align="center"><parameter>SIGSEGV</parameter></entry>

                <entry><foreignphrase>Segmentation
                violation</foreignphrase></entry>

                <entry>Terminaison</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">15</entry>

                <entry align="center"><parameter>SIGTERM</parameter></entry>

                <entry><foreignphrase>Software
                termination</foreignphrase></entry>

                <entry>Terminaison</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Non</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">*</entry>

                <entry align="center"><parameter> SIGSTOP </parameter></entry>

                <entry><foreignphrase>STOP</foreignphrase></entry>

                <entry>Interruption inconditionnelle</entry>

                <entry align="center">Non</entry>

                <entry align="center">Non</entry>

                <entry align="center">Non</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">*</entry>

                <entry align="center"><parameter>SIGTSTP</parameter></entry>

                <entry><foreignphrase>Terminal stop</foreignphrase></entry>

                <entry>Interruption générée par un clavier</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Non</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">*</entry>

                <entry align="center"><parameter>SIGCONT</parameter></entry>

                <entry><foreignphrase>Continue after
                stop</foreignphrase></entry>

                <entry>Ignorer</entry>

                <entry align="center">Non</entry>

                <entry align="center">Non</entry>

                <entry align="center">Non</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">*</entry>

                <entry align="center"><parameter>SIGWINCH</parameter></entry>

                <entry><foreignphrase>Window size
                change</foreignphrase></entry>

                <entry>Ignorer</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Non</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">*</entry>

                <entry align="center"><parameter> SIGUSR1 </parameter></entry>

                <entry><foreignphrase>User defined</foreignphrase></entry>

                <entry>Terminaison</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Non</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry align="center">*</entry>

                <entry align="center"><parameter> SIGUSR2 </parameter></entry>

                <entry><foreignphrase>User defined</foreignphrase></entry>

                <entry>Terminaison</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Oui</entry>

                <entry align="center">Non</entry>
              </row>
            </tbody>
          </tgroup>
        </table> Il existe d'autres signaux (<abbrev>c.f.</abbrev>
      <command>man 3 signal</command>, sous
      <emphasis>FreeBSD</emphasis>).</para>
    </formalpara>

    <para>Les signaux <emphasis>SIGKILL</emphasis> et
    <emphasis>SIGSTOP</emphasis> ne peuvent être ni géré par un gestionnaire,
    ni ignoré, ni suspendu (bloqué). Le premier détruit (<abbrev>i.e.</abbrev>
    terminaison brutale) le processus cible (du signal), tandis que le second
    suspend l'exécution du processus cible jusqu'à réception du signal
    symétrique <emphasis>SIGCONT</emphasis>. Ce dernier peut quant à lui être
    géré par un gestionnaire ou ignoré mais ne peut pas être bloqué.</para>

    <para>Les signaux <emphasis>SIGHUP</emphasis>,
    <emphasis>SIGINT</emphasis>, <emphasis>SIGQUIT</emphasis> et
    <emphasis>SIGTERM </emphasis> ont la signification suivante :
    <itemizedlist>
        <listitem>
          <para><emphasis>SIGHUP</emphasis> : possèdent deux interprétations.
          La première permet à un démon (service) s'il est capable de relire
          son/ses fichier(s) de configuration, de se recharger (suite à des
          modifications) sans avoir à le redémarrer. La seconde, permet de
          terminer (<quote>tuer</quote>) un processus attaché à un terminal,
          <abbrev>i.e.</abbrev> quitter son terminal revient à terminer les
          processus qui lui sont attachés.</para>

          <para>Les processus asynchrones des shells de la famille
          <emphasis>csh</emphasis> et <emphasis>tcsh</emphasis> sont immunisés
          par défaut contre ce signal. Pour ceux de la famille des shells
          <emphasis>Bourne</emphasis> (<emphasis>ksh</emphasis>,
          <emphasis>zsh</emphasis>, <emphasis>bash</emphasis> ...) cette
          immunité peut être simulée avec la commande
          <command>nohup</command>.</para>
        </listitem>

        <listitem>
          <para><emphasis>SIGINT</emphasis> : ce signal est émis en tapant un
          &lt;CTRL-C&gt;. Il a pour effet de terminer (correctement) le
          processus courant.</para>
        </listitem>

        <listitem>
          <para><emphasis>SIGQUIT</emphasis> : entraîne la terminaison
          correcte du processus cible en produisant un fichier image
          (<foreignphrase>aka core dump</foreignphrase>) à moins qu'il ne soit
          intercepté par un gestionnaire de signal.</para>
        </listitem>

        <listitem>
          <para><emphasis>SIGTERM</emphasis> : entraîne la terminaison
          correcte du processus cible.</para>
        </listitem>
      </itemizedlist></para>

    <para>Les signaux <emphasis>SIGUSR1</emphasis> et
    <emphasis>SIGUSR2</emphasis> n'ont pas de sémantique précise. Ils sont
    éventuellement utilisés par les programmes qui leur attribuent librement
    une signification.</para>

    <formalpara>
      <title>Envoi de signaux avec <command>KILL</command>
      (<emphasis>FreeBSD</emphasis>)</title>

      <para>Cette commande permet à l'utilisateur d'envoyer des signaux aux
      processus dont il est propriétaire. Cette restriction ne s'applique
      évidemment pas au <emphasis>super</emphasis>-utilisateur.
      <programlisting width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis cmdlength="4">
            <command>kill</command>

            <arg choice="opt" rep="norepeat">-s signal_name</arg>

            <arg choice="plain" rep="norepeat">pid</arg>

            <sbr />

            <arg choice="plain" rep="norepeat">-l</arg>

            <arg choice="opt" rep="norepeat"><replaceable>exit_status</replaceable></arg>

            <sbr />

            <arg choice="plain" rep="norepeat">-signal_name</arg>

            <arg choice="plain" rep="repeat"><replaceable>pid</replaceable></arg>

            <sbr />

            <arg choice="plain" rep="repeat">-signal_number <replaceable>pid</replaceable></arg>
          </cmdsynopsis>
<emphasis>EXEMPLE :</emphasis> 1) Terminer les processus de pid 1066 et 1072

pascal@Godel:~ &gt; kill 1066 1072                                                 

<emphasis>EXEMPLE :</emphasis> 2) Envoyer le signal SIGHUP au processus de pid 657

pascal@Godel:~ &gt; kill -s HUP 657

<emphasis>EXEMPLE :</emphasis> 3) Envoyer le signal SIGHUP au processus de pid 657 (alternative)

pascal@Godel:~ &gt; kill -HUP 657

</programlisting> Sans numéro ou nom de signal explicite, la commande
      <command>kill</command> envoit le signal <emphasis>SIGTERM</emphasis> au
      processus cible. Il n'y a donc pas de garantie de terminaison puisque ce
      signal peut être intercepté (par un gestionnaire), ignoré ou
      bloqué.</para>
    </formalpara>

    <formalpara>
      <title>Envoi de signaux avec <command>KILL</command>
      (<emphasis>GNU/Linux</emphasis>)</title>

      <para>Elle fonctionne de manière similaire à son alter-ego
      <emphasis>FreeBSD</emphasis>, consulter le <command>man 3
      signal</command>.</para>
    </formalpara>

    <formalpara>
      <title>Envoi de signaux avec <command>KILLALL</command>
      (<emphasis>FreeBSD</emphasis>))</title>

      <para>Si on ne connait pas le <parameter>pid</parameter> du processus
      auquel on veut envoyer un signal, on peut soit le chercher via la
      commande <command>ps</command>, ou bien utiliser la commande
      <command>killall</command> pour faire ce travail. Dans ce cas encore, il
      faut être propriétaire du processus. <programlisting width="80">
<emphasis>SYNOPSIS :</emphasis>
<cmdsynopsis cmdlength="2">
            <command>killall</command>

            <group>
              <arg choice="plain">-d</arg>

              <arg choice="plain">-v</arg>
            </group>

            <group>
              <arg choice="plain">-h</arg>

              <arg choice="plain">-?</arg>
            </group>

            <arg>-help</arg>

            <arg>-l</arg>

            <arg>-m</arg>

            <arg>-s</arg>

            <arg>-u <replaceable>user</replaceable></arg>

            <arg>-t <replaceable>tty</replaceable></arg>

            <sbr />

            <arg choice="opt" rep="norepeat">-c <replaceable>procname</replaceable></arg>

            <arg>-SIGNAL</arg>

            <arg choice="opt" rep="repeat"><replaceable>procname</replaceable></arg>
          </cmdsynopsis>

<emphasis>EXEMPLE :</emphasis> Terminer le/les processus de nom <emphasis>mozilla-bin</emphasis>

pascal@Godel:~ &gt; killall mozilla-bin                                            

</programlisting></para>
    </formalpara>
  </sect1>

  <sect1>
    <title>Commandes de gestion des processus et de leur environnement</title>

    <sect2>
      <title>Résumé des commandes externes</title>

      <para><table>
          <title>Commandes externes</title>

          <!-- one of (graphic mediaobject tgroup) -->

          <tgroup cols="2">
            <colspec colname="c1" colnum="1" colwidth="1*+1" />

            <colspec colname="c2" colnum="2" colwidth="3*+1" />

            <thead>
              <row>
                <!-- one of (entrytbl entry) -->

                <entry>Commandes</entry>

                <entry>Sémantique</entry>
              </row>
            </thead>

            <tbody>
              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>ps</command></entry>

                <entry>Cliché à un instant donné des processus en cours
                d'exécution</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>top</command></entry>

                <entry>Etat en temps <emphasis>réel</emphasis> des processus
                en cours d'exécution.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>kill</command></entry>

                <entry>Utilitaire permettant l'envoi de signal à un processus
                par l'intermédiare de son <parameter>pid</parameter>.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>killall</command></entry>

                <entry>Utilitaire permettant d'envoyer un signal de
                terminaison (<parameter>SIGTERM</parameter>) à des processus,
                reperés par leur nom.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>su</command></entry>

                <entry><abbrev>c.f.</abbrev> commande <xref endterm="su"
                linkend="su" /></entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>ident</command></entry>

                <entry>Affiche toutes les chaînes d'identification
                <parameter>RCS</parameter> d'un fichier, <abbrev>i.e.</abbrev>
                les informations sur la version d'une commande.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>fuser</command></entry>

                <entry>(<emphasis>GNU</emphasis>/<emphasis>Linux</emphasis>)
                Liste les processus utilisant un fichier (ou un
                disque).</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>lsof</command></entry>

                <entry>En l'abscence d'arguments, cette commande liste tous
                les fichiers ouverts de tous les processus en cours.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>at</command></entry>

                <entry>Permet d'exécuter des commandes en temps
                différé.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>crontab</command></entry>

                <entry>Permet d'exécuter des commandes périodiquement.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>jobs</command></entry>

                <entry>Liste les jobs en cours.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>&lt;CTRL&gt;-C</command></entry>

                <entry>Envoit un signal de terminaison
                (<parameter>SIGTERM</parameter>) au processus synchrone
                courant.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>&lt;CTRL&gt;-Z</command></entry>

                <entry>Envoit un signal de suspension
                (<parameter>SIGSTOP</parameter>) au processus synchrone
                courant.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>suspend</command></entry>

                <entry>Suspend un shell (signal
                <parameter>SIGSTOP</parameter>), souvent utilisé pour
                suspendre un <command>shell</command> lancé par la commande
                <command>su</command>.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>env</command></entry>

                <entry>Affiche l'environnement courant ou bien le modifie ou
                bien le crée.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>printenv</command></entry>

                <entry>Permet de visualiser l'environnement courant.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>nice</command></entry>

                <entry>Permet de modifier la priorité d'un processus lors de
                son lancement. Seul le <emphasis>super</emphasis>-utilisateur
                est en mesure de baisser la valeur, donc d'augmenter la
                priorité d'un processus (valeur relative).</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>renice</command></entry>

                <entry>Permet de modifier la priorité d'un processus en cours
                d'exécution, attention on donne une valeur absolue.</entry>
              </row>
            </tbody>
          </tgroup>
        </table></para>
    </sect2>

    <sect2>
      <title>La commande <command>ps</command></title>

      <para>C'est la commande principale d'audit des processus. Elle permet
      d'obtenir un cliché à un instant donné de l'état du système
      (<abbrev>c.f.</abbrev> <command>man 1 ps</command>). L'implementation
      <emphasis>GNU</emphasis> de cette commande lui permet d'accepter à la
      fois la syntaxe <emphasis>BSD</emphasis> et <emphasis>System
      V</emphasis>, sur un système <emphasis>GNU</emphasis>
      <emphasis>Linux</emphasis>.</para>

      <simplesect>
        <title>Les principales options d'un système <emphasis>BSD</emphasis>
        sont :</title>

        <para><itemizedlist>
            <listitem>
              <para><option>a</option> : affiche les processus des autres
              utilisateurs.</para>
            </listitem>

            <listitem>
              <para><option>l</option> : affiche des informations
              supplémentaires associées aux mots clés suivants :
              <parameter>pid</parameter>, <parameter>ppid</parameter>,
              <parameter>cpu</parameter>, <parameter>pri</parameter>,
              <parameter>nice</parameter>, <parameter>vsz</parameter>,
              <parameter>rss</parameter>, <parameter>wchan</parameter>,
              <parameter>state</parameter>, <parameter>tt</parameter>,
              <parameter>time</parameter> et
              <parameter>command</parameter>.</para>
            </listitem>

            <listitem>
              <para><option>u</option> : affiche des informations associés au
              mots clés suivants : <parameter>user</parameter>,
              <parameter>pid</parameter>, <parameter>%cpu</parameter>,
              <parameter>%mem</parameter>, <parameter>vsz</parameter>,
              <parameter>rss</parameter>, <parameter>tt</parameter>,
              <parameter>state</parameter>, <parameter>start</parameter>,
              <parameter>time</parameter> et
              <parameter>command</parameter>.</para>
            </listitem>

            <listitem>
              <para><option>U username</option> : affiche les processus
              appartenant à username.</para>
            </listitem>

            <listitem>
              <para><option>w</option> : affichage en mode 132
              colonnes.</para>
            </listitem>

            <listitem>
              <para><option>x</option> : affiche des informations sur les
              processus ne possédant pas de terminal de controle.</para>
            </listitem>
          </itemizedlist></para>
      </simplesect>

      <simplesect>
        <title>Exemples</title>

        <para>Orientation <emphasis>BSD</emphasis>, lister tous les processus
        : <programlisting>
pascal@Godel:~ &gt; ps aux
USER      PID %CPU %MEM   VSZ  RSS  TT  STAT STARTED      TIME COMMAND
pascal  12018  0.0  0.0   460  256  p4  R+    2:56PM   0:00.00 ps aux
root        1  0.0  0.0   552  316  ??  ILs  Sun03PM   0:00.04 /sbin/init --
root        2  0.0  0.0     0    0  ??  DL   Sun03PM   0:00.59  (pagedaemon)
root        3  0.0  0.0     0    0  ??  DL   Sun03PM   0:00.00  (vmdaemon)
root        4  0.0  0.0     0    0  ??  DL   Sun03PM   0:02.99  (bufdaemon)
root        5  0.0  0.0     0    0  ??  DL   Sun03PM   0:02.59  (vnlru)
root        6  0.0  0.0     0    0  ??  DL   Sun03PM   3:11.79  (syncer)
root       12  0.0  0.0   592  288  ??  DLs  Sun03PM   0:00.00 vinum: vinum daemon (vinum)
root       36  0.0  0.0   212   96  ??  Is   Sun03PM   0:00.00 adjkerntz -i
root       90  0.0  0.1   944  588  ??  Ss   Sun11AM   0:00.96 /usr/sbin/syslogd -ss
root       98  0.0  0.1   988  724  ??  Ss   Sun11AM   0:01.01 /usr/sbin/cron
root      100  0.0  0.2  2320 1644  ??  Ss   Sun11AM   0:00.06 /usr/sbin/sshd
root      216  0.0  0.3  3620 3116  ??  Ss   Sun11AM   8:17.45 /usr/local/sbin/cupsd
root      294  0.0  0.1   948  660  v0  Is+  Sun11AM   0:00.00 /usr/libexec/getty Pc ttyv0
root      295  0.0  0.1   948  660  v1  Is+  Sun11AM   0:00.00 /usr/libexec/getty Pc ttyv1
root      296  0.0  0.1   948  660  v2  Is+  Sun11AM   0:00.00 /usr/libexec/getty Pc ttyv2
root      297  0.0  0.1   948  660  v3  Is+  Sun11AM   0:00.00 /usr/libexec/getty Pc ttyv3
root      298  0.0  0.1   948  660  v4  Is+  Sun11AM   0:00.00 /usr/libexec/getty Pc ttyv4
root      299  0.0  0.1   948  660  v5  Is+  Sun11AM   0:00.00 /usr/libexec/getty Pc ttyv5
root      300  0.0  0.1   948  660  v6  Is+  Sun11AM   0:00.00 /usr/libexec/getty Pc ttyv6
root      301  0.0  0.1   948  660  v7  Is+  Sun11AM   0:00.00 /usr/libexec/getty Pc ttyv7
root      302  0.0  0.2  4436 2052  ??  S    Sun11AM   0:00.09 /usr/X11R6/bin/wdm -nodaemon ttyv8
pascal    335  0.0  0.4  5468 4136  ??  Ss   Sun11AM   1:31.67 /usr/X11R6/bin/wmaker
pascal    350  0.0  0.1  1928 1404  ??  Ss   Sun11AM   0:02.46 ssh-agent /usr/X11R6/bin/wmaker
pascal    354  0.0  0.5  6108 5124  ??  S    Sun11AM   0:04.25 Eterm -X /home/pascal/.Eterm/MAIN
pascal    358  1.0  1.1 13624 11360 ??  S    Sun11AM  71:30.17 gkrellm
pascal    359  0.0  0.5  6612 5652  ??  S    Sun11AM   0:04.92 Eterm -X /home/pascal/.Eterm/MAIN
pascal    362  0.0  0.1  2104 1524  ??  S    Sun11AM   2:08.34 /usr/X11R6/bin/wmitime
pascal    363  0.0  0.1  2052 1440  ??  S    Sun11AM   6:36.14 wmmatrix -med
pascal    399  0.0  0.2  3236 1648  ??  Ss   Sun11AM   0:03.61 /usr/local/bin/fetchmail -F -K
pascal    413  0.0  0.2  2840 2248  ??  S    Sun11AM   0:08.34 /usr/X11R6/bin/xscreensaver
pascal    437  0.0  0.2  2048 1780  p4  Ss   Sun11AM   0:00.69 -tcsh (tcsh)
pascal    467  0.0  0.2  2056 1780  p5  Is   Sun11AM   0:00.25 -tcsh (tcsh)
pascal    607  0.0  0.3  4188 3252  p5  S+   Sun11AM   0:08.20 mutt
pascal   1782  0.0  0.2  2080 1712  p0  Ss+  Sun08PM   0:00.28 ssh -p 3322 -v pascal@Turing
pascal  10556  0.0  1.1 13256 11568 p4  S     8:12AM   1:06.67 xemacs p2_proc.xml (xemacs-21)
pascal  11320  0.0  1.1 16804 11620 ??  S    10:55AM   5:38.90 /usr/X11R6/bin/xmms
root        0  0.0  0.0     0    0  ??  DLs  Sun03PM   0:00.00  (swapper)
</programlisting></para>

        <para>Lister les processus de l'utilisateur
        <emphasis>pascal</emphasis> : <programlisting>
pascal@Godel:~ &gt; ps U pascal
  PID  TT  STAT      TIME COMMAND
  335  ??  Ss     1:32.48 /usr/X11R6/bin/wmaker
  350  ??  Ss     0:02.47 ssh-agent /usr/X11R6/bin/wmaker
  354  ??  S      0:04.27 Eterm -X /home/pascal/.Eterm/MAIN                                      
  358  ??  S     71:57.96 gkrellm
  359  ??  S      0:05.40 Eterm -X /home/pascal/.Eterm/MAIN
  362  ??  S      2:08.96 /usr/X11R6/bin/wmitime
  363  ??  S      6:38.70 wmmatrix -med
  399  ??  Is     0:03.61 /usr/local/bin/fetchmail -F -K
  413  ??  S      0:08.53 /usr/X11R6/bin/xscreensaver
11320  ??  S      5:57.42 /usr/X11R6/bin/xmms
11840  ??  S      0:00.31 Eterm -X /home/pascal/.Eterm/MAIN
 1782  p0  Is+    0:00.28 ssh -p 3322 -v pascal@Turing.corto.home
  437  p4  Is     0:00.23 -tcsh (tcsh)
10556  p4  S      1:09.24 xemacs p2_proc.xml (xemacs-21)
12130  p4  R+     0:00.00 ps U pascal
  467  p5  Is     0:00.25 -tcsh (tcsh)
  607  p5  I+     0:08.20 mutt
</programlisting></para>
      </simplesect>

      <simplesect>
        <title>Les principales options d'un système <emphasis>GNU</emphasis>
        <emphasis>Linux</emphasis> sont :</title>

        <para>Orientation <emphasis>System V</emphasis> : <itemizedlist>
            <listitem>
              <para><option>-e</option> : affiche des informations sur tous
              les processus.</para>
            </listitem>

            <listitem>
              <para><option>-f</option> : afiche des informations
              supplémentaires associées aux mots clés suivants :
              <parameter>uid</parameter>, <parameter>pid</parameter>,
              <parameter>ppid</parameter>, <parameter>c</parameter>,
              <parameter>stime</parameter> et
              <parameter>command</parameter>.</para>
            </listitem>

            <listitem>
              <para><option>-u username</option> : affiche les informations
              relatives à tous les processus de l'utilisateur
              <foreignphrase>username</foreignphrase>.</para>
            </listitem>
          </itemizedlist></para>
      </simplesect>

      <simplesect>
        <title>Exemples</title>

        <para>Orienté <emphasis>System V</emphasis> <programlisting>
pascal@tux:~ &gt; ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 14:19 ?        00:00:03 init [2] 
root         2     1  0 14:19 ?        00:00:00 [keventd]
root         3     0  0 14:19 ?        00:00:00 [ksoftirqd_CPU0]
root         4     0  0 14:19 ?        00:00:00 [kswapd]
root         5     0  0 14:19 ?        00:00:00 [bdflush]
root         6     0  0 14:19 ?        00:00:00 [kupdated]
root         7     1  0 14:19 ?        00:00:00 [kjournald]
root        42     1  0 14:19 ?        00:00:00 [khubd]
root        82     1  0 14:19 ?        00:00:00 [kjournald]
root        83     1  0 14:19 ?        00:00:00 [kjournald]
root        84     1  0 14:19 ?        00:00:00 [kjournald]
root        85     1  0 14:19 ?        00:00:00 [kjournald]
root        86     1  0 14:19 ?        00:00:00 [kjournald]
root        87     1  0 14:19 ?        00:00:00 [kjournald]
root        88     1  0 14:19 ?        00:00:00 [kjournald]
root       114     1  0 14:20 ?        00:00:00 [eth0]
root       195     1  0 14:20 ?        00:00:00 /sbin/syslogd
root       198     1  0 14:20 ?        00:00:00 /sbin/klogd
root       366     1  0 14:20 ?        00:00:00 /usr/sbin/sshd
daemon     381     1  0 14:20 ?        00:00:00 /usr/sbin/atd
root       384     1  0 14:20 ?        00:00:00 /usr/sbin/cron
root       398     1  0 14:20 ?        00:00:00 /usr/sbin/apache-ssl
www-data   408   398  0 14:20 ?        00:00:00 /usr/lib/apache-ssl/gcache 33 /var/run/gcache_po
www-data   412   398  0 14:20 ?        00:00:00 /usr/sbin/apache-ssl
root       417     1  0 14:20 ?        00:00:00 /usr/bin/X11/wdm
root       420     1  0 14:20 tty1     00:00:00 /sbin/getty 38400 tty1
root       421     1  0 14:20 tty2     00:00:00 /sbin/getty 38400 tty2
root       422     1  0 14:20 tty3     00:00:00 /sbin/getty 38400 tty3
root       423     1  0 14:20 tty4     00:00:00 /sbin/getty 38400 tty4
root       427   417  0 14:20 ?        00:00:01 /usr/bin/X11/X -nolisten TCP -auth /var/lib/wdm/
root       428   417  0 14:20 ?        00:00:00 -:0             
root       437   428  0 14:20 ?        00:00:00 wdmLogin -d:0 -wdefault:twm:wmaker -l/usr/share/
root       438   366  0 14:21 ?        00:00:00 /usr/sbin/sshd
pascal     440   438  0 14:21 ?        00:00:00 /usr/sbin/sshd
pascal     441   440  0 14:21 pts/0    00:00:00 -bash
pascal     518   441  0 15:33 pts/0    00:00:00 ps -ef
</programlisting></para>

        <para>Orienté <emphasis>BSD</emphasis> <programlisting>
pascal@tux:~ &gt; ps aux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  1212  472 ?        S    14:19   0:03 init [2] 
root         2  0.0  0.0     0    0 ?        SW   14:19   0:00 [keventd]
root         3  0.0  0.0     0    0 ?        SWN  14:19   0:00 [ksoftirqd_CPU0]
root         4  0.0  0.0     0    0 ?        SW   14:19   0:00 [kswapd]
root         5  0.0  0.0     0    0 ?        SW   14:19   0:00 [bdflush]
root         6  0.0  0.0     0    0 ?        SW   14:19   0:00 [kupdated]
root         7  0.0  0.0     0    0 ?        SW   14:19   0:00 [kjournald]
root        42  0.0  0.0     0    0 ?        SW   14:19   0:00 [khubd]
root        82  0.0  0.0     0    0 ?        SW   14:19   0:00 [kjournald]
root        83  0.0  0.0     0    0 ?        SW   14:19   0:00 [kjournald]
root        84  0.0  0.0     0    0 ?        SW   14:19   0:00 [kjournald]
root        85  0.0  0.0     0    0 ?        SW   14:19   0:00 [kjournald]
root        86  0.0  0.0     0    0 ?        SW   14:19   0:00 [kjournald]
root        87  0.0  0.0     0    0 ?        SW   14:19   0:00 [kjournald]
root        88  0.0  0.0     0    0 ?        SW   14:19   0:00 [kjournald]
root       114  0.0  0.0     0    0 ?        SW   14:19   0:00 [eth0]
root       195  0.0  0.1  1984  756 ?        S    14:20   0:00 /sbin/syslogd
root       198  0.0  0.2  1856 1128 ?        S    14:20   0:00 /sbin/klogd
root       366  0.0  0.2  2492 1192 ?        S    14:20   0:00 /usr/sbin/sshd
daemon     381  0.0  0.1  1316  552 ?        S    14:20   0:00 /usr/sbin/atd
root       384  0.0  0.1  1396  664 ?        S    14:20   0:00 /usr/sbin/cron
root       398  0.0  0.9 73840 4824 ?        S    14:20   0:00 /usr/sbin/apache-ssl
www-data   408  0.0  0.1  2872  784 ?        S    14:20   0:00 /usr/lib/apache-ssl/gcache 33 /va
www-data   412  0.0  0.9 73856 4848 ?        S    14:20   0:00 /usr/sbin/apache-ssl
root       417  0.0  0.2  3960 1256 ?        S    14:20   0:00 /usr/bin/X11/wdm
root       420  0.0  0.0  1200  444 tty1     S    14:20   0:00 /sbin/getty 38400 tty1
root       421  0.0  0.0  1200  444 tty2     S    14:20   0:00 /sbin/getty 38400 tty2
root       422  0.0  0.0  1200  444 tty3     S    14:20   0:00 /sbin/getty 38400 tty3
root       423  0.0  0.0  1200  444 tty4     S    14:20   0:00 /sbin/getty 38400 tty4
root       427  0.0  1.4 58320 7456 ?        S&lt;   14:20   0:01 /usr/bin/X11/X -nolisten TCP -aut
root       428  0.0  0.2  3964 1352 ?        S    14:20   0:00 -:0             
root       437  0.0  0.3  4364 2032 ?        S    14:20   0:00 wdmLogin -d:0 -wdefault:twm:wmake
root       438  0.0  0.3  6200 1844 ?        S    14:21   0:00 /usr/sbin/sshd
pascal     440  0.0  0.3  6288 1916 ?        R    14:21   0:00 /usr/sbin/sshd
pascal     441  0.0  0.2  2308 1356 pts/0    S    14:21   0:00 -bash
pascal     539  0.0  0.1  2488  752 pts/0    R    15:54   0:00 ps aux
</programlisting></para>

        <para>visaliser la hiérarchie des processus avec l'option
        <option>f</option> (<foreignphrase>forest</foreignphrase>)
        <programlisting width="80">
pascal@tux:~ &gt; ps faux
USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0  1208  464 ?        S    Sep10   0:04 init
root         2  0.0  0.0     0    0 ?        SW   Sep10   0:00 [keventd]
root         3  0.0  0.0     0    0 ?        SWN  Sep10   0:00 [ksoftirqd_CPU0]
root         4  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kswapd]
root         5  0.0  0.0     0    0 ?        SW   Sep10   0:00 [bdflush]
root         6  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kupdated]
root         7  0.0  0.0     0    0 ?        SW&lt;  Sep10   0:00 [mdrecoveryd]
root         8  0.0  0.0     0    0 ?        SW&lt;  Sep10   0:00 [raid1d]
root         9  0.0  0.0     0    0 ?        SW&lt;  Sep10   0:00 [raid1d]
root        10  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        87  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        88  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        89  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        90  0.0  0.0     0    0 ?        SW   Sep10   0:01 [kjournald]
root        91  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        92  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        93  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        94  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        95  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        96  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        97  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        98  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root        99  0.0  0.0     0    0 ?        SW   Sep10   0:00 [kjournald]
root       192  0.0  0.2  1832 1104 ?        S    Sep10   0:00 /sbin/klogd
root       203  0.0  0.2  2312 1212 ?        S    Sep10   0:00 /bin/sh /usr/bin/
jmysql     240  0.0  1.2 38964 6304 ?        S    Sep10   0:01  \_ /usr/sbin/mys
jmysql     244  0.0  1.2 38964 6304 ?        S    Sep10   0:01      \_ /usr/sbin
jmysql     245  0.0  1.2 38964 6304 ?        S    Sep10   0:00          \_ /usr/
jmysql     246  0.0  1.2 38964 6304 ?        S    Sep10   0:00          \_ /usr/
daemon     262  0.0  0.1  1316  552 ?        S    Sep10   0:00 /usr/sbin/atd
root       265  0.0  0.1  1396  660 ?        S    Sep10   0:00 /usr/sbin/cron
root       282  0.0  0.0  1200  444 tty4     S    Sep10   0:00 /sbin/getty 38400
root       283  0.0  0.0  1200  444 tty5     S    Sep10   0:00 /sbin/getty 38400
root       284  0.0  0.0  1200  444 tty6     S    Sep10   0:00 /sbin/getty 38400
root       586  0.0  0.2  2432 1492 tty1     S    Sep10   0:00 -bash
root       652  0.0  0.1  1288  576 ?        S    Sep10   0:00 /sbin/syslogd -a 
root       858  0.0  0.3  3864 2020 ?        S    Sep10   0:00 /usr/sbin/apache
japache    859  0.0  0.4  3932 2172 ?        S    Sep10   0:00  \_ /usr/sbin/apa
japache    860  0.0  0.4  3932 2172 ?        S    Sep10   0:00  \_ /usr/sbin/apa
japache    861  0.0  0.4  3932 2172 ?        S    Sep10   0:00  \_ /usr/sbin/apa
japache    862  0.0  0.4  3932 2172 ?        S    Sep10   0:00  \_ /usr/sbin/apa
japache    863  0.0  0.4  3932 2172 ?        S    Sep10   0:00  \_ /usr/sbin/apa
japache    864  0.0  0.4  3932 2172 ?        S    Sep10   0:00  \_ /usr/sbin/apa
japache    865  0.0  0.4  3932 2172 ?        S    Sep10   0:00  \_ /usr/sbin/apa
japache   3857  0.0  0.4  3932 2148 ?        S    Sep13   0:00  \_ /usr/sbin/apa
root     15968  0.0  0.7 73072 3924 ?        S    Sep24   0:00 /usr/sbin/apache-
japache  15969  0.0  0.2  3756 1132 ?        S    Sep24   0:00  \_ /usr/lib/apac
japache  27240  0.0  1.0 73732 5612 ?        S    Oct02   0:01  \_ /usr/sbin/apa
japache  27847  0.0  1.0 73656 5512 ?        S    Oct02   0:00  \_ /usr/sbin/apa
japache  27865  0.0  1.0 73660 5520 ?        S    Oct02   0:00  \_ /usr/sbin/apa
japache  27869  0.0  1.0 73596 5440 ?        S    Oct02   0:00  \_ /usr/sbin/apa
japache  27870  0.0  1.0 73640 5532 ?        S    Oct02   0:00  \_ /usr/sbin/apa
japache  27871  0.0  1.0 73664 5536 ?        S    Oct02   0:00  \_ /usr/sbin/apa
japache  27923  0.0  1.0 73580 5468 ?        S    Oct02   0:00  \_ /usr/sbin/apa
japache  27986  0.0  1.0 73644 5520 ?        S    Oct02   0:00  \_ /usr/sbin/apa
root     17691  0.0  0.0  1200  444 tty2     S    Sep25   0:00 /sbin/getty 38400
root     24280  0.0  0.2  2684 1348 ?        S    Sep30   0:00 /usr/sbin/sshd
root     28525  0.0  0.3  5684 1748 ?        S    06:56   0:00  \_ sshd: pascal 
pascal   28527  0.0  0.3  5708 1812 ?        R    06:56   0:00    \_ sshd: pas
pascal   28528  0.2  0.2  2408 1460 pts/0    S    06:56   0:00      \_ -bash
pascal   28532  0.0  0.1  2528  752 pts/0    R    06:56   0:00        \_ ps faux
root     26076  0.0  0.0  1200  444 tty3     S    Oct01   0:00 /sbin/getty 38400
</programlisting></para>
      </simplesect>

      <!-- 
	<para>
	<command>su</command>, 
	<command>ident</command>, <command>fuser</command>, <command>lsof</command> (file/process ?)
	<command>at</command>, <command>crontab</command>, 
	<command>jobs</command>, <command>&lt;CTRL&gt;-C</command>, <command>&lt;CTRL&gt;-Z</command>, <command>suspend</command>
	<command>env</command>, <command>printenv</command>
	</para>

	<para> <command>&lt;cmd&gt; &amp;</command>, <command>exec &lt;cmd&gt;</command>, <command>wait</command>, <command>. &lt;cmd&gt;</command> ou <command>source  &lt;cmd&gt;</command></para> 
-->
    </sect2>

    <sect2>
      <title>La commande <command>top</command></title>

      <para>Cette commande permet d'avoir des informations en temps réel sur
      les processus.</para>

      <para><programlisting>
pascal@Godel:~ &gt; top
last pid: 12503;  load averages:  0.19,  0.09,  0.08                     up 4+04:56:36  16:22:33
38 processes:  1 running, 37 sleeping
CPU states:  7.0% user,  0.0% nice,  3.5% system,  1.2% interrupt, 88.4% idle
Mem: 150M Active, 498M Inact, 76M Wired, 132K Cache, 112M Buf, 279M Free
Swap: 4096M Total, 4096M Free

  PID USERNAME PRI NICE  SIZE    RES STATE    TIME   WCPU    CPU COMMAND
  308 root       2   0   144M   141M select  95:19  1.95%  1.95% XFree86
  359 pascal     2   0  6872K  5912K select   0:08  1.17%  1.17% Eterm
  358 pascal     2   0 13624K 11360K poll    73:04  1.03%  1.03% gkrellm
12503 pascal    28   0  1992K  1208K RUN      0:00  1.75%  0.63% top
11320 pascal     2   0 16804K 11620K poll     6:40  0.10%  0.10% xmms
  216 root       2   0  3620K  3116K select   8:18  0.00%  0.00% cupsd
  363 pascal     2   0  2052K  1440K select   6:45  0.00%  0.00% wmmatrix
  767 pascal     2   0 64436K 57352K poll     4:10  0.00%  0.00% mozilla-bin
  362 pascal    10   0  2104K  1524K nanslp   2:10  0.00%  0.00% wmitime
  335 pascal     2   0  5468K  4136K select   1:35  0.00%  0.00% wmaker
10556 pascal     2   0 13324K 12564K poll     1:31  0.00%  0.00% xemacs-21.1.14
  413 pascal     2   0  2840K  2248K poll     0:09  0.00%  0.00% xscreensaver
  320 nobody    10   0  2288K  1740K nanslp   0:09  0.00%  0.00% cups-polld
 5051 pascal     2   0  6072K  4768K poll     0:07  0.00%  0.00% xdiary
  354 pascal     2   0  6108K  5124K select   0:04  0.00%  0.00% Eterm
  399 pascal     2   0  3236K  1648K select   0:04  0.00%  0.00% fetchmail
  350 pascal     2   0  1928K  1404K select   0:02  0.00%  0.00% ssh-agent
 1781 pascal     2   0  2368K  1784K select   0:02  0.00%  0.00% rxvt
11840 pascal     2   0  6680K  5844K select   0:02  0.00%  0.00% Eterm
   98 root      10   0   988K   724K nanslp   0:01  0.00%  0.00% cron
   90 root       2   0   944K   588K select   0:01  0.00%  0.00% syslogd
  437 pascal    18   0  2048K  1792K pause    0:01  0.00%  0.00% tcsh
 1782 pascal     2   0  2080K  1712K select   0:00  0.00%  0.00% ssh
11860 pascal     2   0  2204K  1736K select   0:00  0.00%  0.00% ssh
  467 pascal    18   0  2056K  1780K pause    0:00  0.00%  0.00% tcsh
11843 pascal    18   0  2056K  1776K pause    0:00  0.00%  0.00% tcsh
  302 root       2   0  4436K  2052K select   0:00  0.00%  0.00% wdm
  100 root       2   0  2320K  1644K select   0:00  0.00%  0.00% sshd
12450 pascal     2   0  2824K  1908K poll     0:00  0.00%  0.00% mutt
  309 root      10   0  4544K  2308K wait     0:00  0.00%  0.00% wdm
  258 root      10   0   644K   452K wait     0:00  0.00%  0.00% sh
  756 pascal    10   0   652K   460K wait     0:00  0.00%  0.00% sh
  294 root       3   0   948K   660K ttyin    0:00  0.00%  0.00% getty
  297 root       3   0   948K   660K ttyin    0:00  0.00%  0.00% getty
  300 root       3   0   948K   660K ttyin    0:00  0.00%  0.00% getty
  296 root       3   0   948K   660K ttyin    0:00  0.00%  0.00% getty
  301 root       3   0   948K   660K ttyin    0:00  0.00%  0.00% getty
   36 root      18   0   212K    96K pause    0:00  0.00%  0.00% adjkerntz
</programlisting> Par défaut, l'affichage est rafraichi toutes les 2
      <emphasis>s</emphasis> sur un système <emphasis>FreeBSD</emphasis> (tous
      les 5 <emphasis>s</emphasis> sur un système
      <emphasis>Debian</emphasis>), les processus les plus actifs apparaissant
      au sommet de la liste. Cette commande prend en compte les entrées du
      terminal courant, il est donc possible d'envoyer des signaux aux
      processus et/ou de modifier leur priorité (<command>renice</command>) ou
      encore de modifier l'ordre d'affichage.</para>

      <para>Attention cette commande consomme un temps
      <foreignphrase>CPU</foreignphrase> non négligeable, son usage est donc à
      réserver à des fins de diagnostics.</para>
    </sect2>

    <!--
      <sect3>
      <title>La commande <command>su</command></title>
      <para/>
      </sect3>
-->

    <sect2>
      <title>Résumé des commandes internes</title>

      <para><table>
          <title>Commandes internes</title>

          <!-- one of (graphic mediaobject tgroup) -->

          <tgroup cols="2">
            <colspec colname="c1" colnum="1" colwidth="1*+1" />

            <colspec colname="c2" colnum="2" colwidth="3*+1" />

            <thead>
              <row>
                <!-- one of (entrytbl entry) -->

                <entry>Commandes</entry>

                <entry>Sémantique</entry>
              </row>
            </thead>

            <tbody>
              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>&lt;cmd&gt; &amp;</command></entry>

                <entry>Lance l'exécution de la commande
                <command>&lt;cmd&gt;</command> de manière asynchrone
                (arrère-plan).</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>&lt;cmd&gt;</command></entry>

                <entry>Lance l'exécution de la commande de manière synchrone
                (avant-plan).</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>exec &lt;cmd&gt;</command></entry>

                <entry>Subsitue au <command>shell</command> courant,
                l'exécution de la commande
                <command>&lt;cmd&gt;</command>.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>wait</command></entry>

                <entry>Attend la terminaison de tous les processus asynchrones
                enfants du processus courant.</entry>
              </row>

              <row>
                <!-- one of (entrytbl entry) -->

                <entry><command>. &lt;cmd&gt;</command> ou <command>source
                &lt;cmd&gt;</command></entry>

                <entry>Exécute la commande <command>&lt;cmd&gt;</command> dans
                le contexte du <command>shell</command> courant,
                <abbrev>i.e.</abbrev> pas de <command>fork</command>.</entry>
              </row>
            </tbody>
          </tgroup>
        </table></para>
    </sect2>
  </sect1>

  <sect1>
    <title>Tâches périodiques</title>

    <para>Le démon <command>crond</command> est chargé d'exécuter les
    processus (ou tâches) régulières sur les systèmes
    <emphasis>Unix</emphasis>, tandis que le démon <command>atd</command>
    exécute des processus différés dans le temps.</para>

    <para>L'administrateur dispose de deux fichiers pour définir qui est
    autorisé à exécuter des processus périodiques :
    <filename>/var/cron/allow</filename>, <filename>/var/cron/deny</filename>
    sous <emphasis>FreeBSD</emphasis> (resp.
    dans<filename>/etc/cron.allow</filename>,
    <filename>/etc/cron.deny</filename> sous <emphasis>GNU</emphasis>
    <emphasis>Linux</emphasis>)</para>

    <para>Si ces fichiers n'existent pas alors deux cas symétriques, selon les
    systèmes : <orderedlist>
        <listitem>
          <para>seul <quote>root</quote> est autorisé ou</para>
        </listitem>

        <listitem>
          <para>tous les utilisateurs sont autorisés (cas par défaut pour
          <emphasis>FreeBSD</emphasis> et <emphasis>Debian</emphasis>).</para>
        </listitem>
      </orderedlist></para>

    <para>Si le fichier <filename>/var/cron/allow</filename>
    (<filename>/etc/cron.allow</filename>), alors les utilisateurs qui y
    figurent (à raison d'un par ligne) sont autorisés à exécuter des tâches
    <quote>cron</quote>, les autres non. Autrement dit, on interdit par défaut
    tous les utilisateurs et on explicite les autorisations.</para>

    <para>On a le cas symétrique si le fichier
    <filename>/var/cron/deny</filename> (<filename>/etc/cron.deny</filename>)
    existe, <abbrev>i.e.</abbrev> les utilisateurs qui y figurent (à raison
    d'un par ligne) ne sont pas autorisés à exécuter des tâches
    <quote>cron</quote>, les autres oui.</para>

    <para>Si on figure dans les deux fichiers, l'autorisation l'emporte
    !</para>

    <para>Le démon <command>crond</command> enregistre son activité dans le
    fichier <filename>/var/log/cron</filename> et enregistre les requêtes
    <quote>cron</quote> des utilisateurs dans le répertoire
    <filename>/var/cron/tabs</filename> (resp. dans
    <filename>/var/spool/cron</filename> sous <emphasis>GNU</emphasis>
    <emphasis>Linux</emphasis>), sous le nom de l'utilisateur, ce qui limite à
    un le nombre de fichiers <quote>cron</quote> par utilisateur.</para>

    <para>A l'exécution d'une commande le démon <command>crond</command>
    définit un environnement minimal déterminé par les variables
    <varname>SHELL</varname>, <varname>PATH</varname> (réduit à
    /etc:/bin:/sbin:/usr/bin:/usr/sbin, sous <emphasis>FreeBSD</emphasis>),
    <varname>HOME</varname> et <varname>LOGNAME</varname>. Il est possible
    d'enrichir cet environnement de base en définissant des variables
    supplémentaires dans le fichier <quote>cron</quote>.</para>

    <para>Si une commande nécessite l'entrée standard, il est nécessaire de
    prévoir sa redirection explicitement. Par défaut les sorties standard et
    d'erreurs sont envoyées vers la boite à lettre de l'utilisateur.</para>

    <para>Le <emphasis>super</emphasis>-utilisateur dispose du fichier
    <filename>/etc/crontab</filename> pour l'exécution périodique des tâches
    avec n'importe quel utilisateur du système.</para>

    <formalpara>
      <title>Exemple, le fichier <filename>/etc/crontab</filename></title>

      <para><programlisting width="80">
# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD: src/etc/crontab,v 1.21.2.3 2000/12/08 10:56:07 obrien Exp $         
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#
#minute hour    mday    month   wday    who     command
#
*/5     *       *       *       *       root    /usr/libexec/atrun
#
# rotate log files every hour, if necessary
0       *       *       *       *       root    newsyslog
#
# do daily/weekly/monthly maintenance
1       3       *       *       *       root    periodic daily
15      4       *       *       6       root    periodic weekly
30      5       1       *       *       root    periodic monthly
#
# time zone change adjustment for wall cmos clock,
# does nothing, if you have UTC cmos clock.
# See adjkerntz(8) for details.
1,31    0-5     *       *       *       root    adjkerntz -a

</programlisting></para>
    </formalpara>

    <!--
      <para> Ce fichier au format texte, liste les processus (tâches) exécutés périodiquement. Une ligne est typiquement structurée en 7 champs (pour le fichier <filename>/etc/crontab</filename>, 6 pour les fichiers utilisateurs) séparés par des tabulations : </para>
      <simpara><varname>Minutes </varname> <varname>Heures </varname> <varname>Jour du mois </varname> <varname>Mois </varname> <varname>Jour de la semaine </varname> <varname>Identité </varname> <varname>Commande </varname></simpara>
-->

    <para>Ce fichier au format texte, liste les processus (tâches) exécutés
    périodiquement. Une ligne est typiquement structurée en 7 champs (pour le
    fichier <filename>/etc/crontab</filename>, 6 pour les fichiers
    utilisateurs) séparés par des tabulations : </para>

    <para><varname>Minutes</varname> <varname>Heures</varname> <varname>Jour
    du mois</varname> <varname>Mois</varname> <varname>Jour de la semaine
    </varname><varname>Identité</varname> <varname>Commande</varname> </para>

    <para>Le contenu d'un champ exprime un élément de la périodicité :
    <itemizedlist>
        <listitem>
          <para>Une valeur indique à quel moment exécuter la commande. La
          valeur 10 dans le premier champ signifie à la
          10<superscript>e</superscript> minute, tandis que située dans le
          champ <emphasis>Jour du mois</emphasis>, elle signifie 10
          <superscript>e</superscript> jour du mois ...</para>
        </listitem>

        <listitem>
          <para>Une liste de valeurs séparées par des virgules indique les
          moments d'exécution de la commande. La liste 2,4,6 dans le champ
          <emphasis>mois</emphasis> signifie février, avril et juin.</para>
        </listitem>

        <listitem>
          <para>Un intervalle de valeur est dénoté par la présence du tiret
          (-). L'intervalle 1-5 dans le champ <emphasis>jour</emphasis> de la
          semaine signifie du lundi au vendredi (bornes incluses).
          L'intervalle 0-23/2 dans le <emphasis>champ heure</emphasis>
          signifie (en extension) 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22
          heures.</para>
        </listitem>

        <listitem>
          <para>Le méta-caractère * dénote le plus grand intervalle possible.
          Dans le champ <emphasis>minute</emphasis>, il dénote l'intervalle
          0-59. La valeur */15 dans le champ <emphasis>minute</emphasis>
          signifie tous les 15 minutes (0, 15, 30, 45).</para>
        </listitem>
      </itemizedlist></para>
  </sect1>

  <sect1>
    <title>Exercices</title>

    <simplesect>
      <title>Exercice 1</title>

      <para>Lancer la commande suivante : <programlisting width="80">
$ sleep 500 &amp;                                                                   
</programlisting></para>

      <para>Indiquer comment obtenir le processus père de ce processus.</para>

      <para>Terminer ce processus.</para>
    </simplesect>

    <simplesect>
      <title>Exercice 2</title>

      <para>Le <quote>démon</quote> <command>crond</command> s'exécute t'il
      sur votre machine ? si oui quel est son <emphasis>pid</emphasis>
      ?</para>
    </simplesect>

    <simplesect>
      <title>Exercice 3</title>

      <para>Comment interdire à l'utilisateur (<abbrev>c.f.</abbrev> le login
      du compte personnel) d'utiliser la commande <command>crontab</command>
      ?</para>
    </simplesect>

    <simplesect>
      <title>Exercice 4</title>

      <para>Sur <emphasis>GNU/Linux</emphasis> lister l'arborescence complète
      (avec la filiation) de vos processus
      (<emphasis>sysop</emphasis>).</para>

      <para>Sur <emphasis>FreeBSD</emphasis> installer le port
      <filename>pstree</filename> et faire de même.</para>
    </simplesect>

    <simplesect>
      <title>Exercice 5</title>

      <para>Sous votre compte (<emphasis>sysop</emphasis>), créez un fichier
      <filename>crontab</filename> réalisant les actions suivantes :
      <orderedlist>
          <listitem>
            <para>Ajout toutes les minutes du message <quote>Hello
            world</quote> suivit de la date (format AAAA-MM-JJ:hh:mm:ss) dans
            un fichier <filename>/tmp/cron_`whoami`.log</filename>.</para>
          </listitem>

          <listitem>
            <para>Liste de vos processus toutes les 10 minutes entre 08h00 et
            17h00, du lundi au vendredi.</para>
          </listitem>
        </orderedlist> Assurez-vous que cela fonctionne, puis
      supprimer-le.</para>
    </simplesect>
  </sect1>

  <bibliography>
    <title>Références</title>

    <bibliodiv>
      <biblioentry>
        <abbrev>1</abbrev>

        <author>
          <surname>MAN</surname>
        </author>

        <title>Manual pages</title>
      </biblioentry>

      <biblioentry>
        <abbrev>2</abbrev>

        <authorgroup>
          <!-- one of (othercredit corpauthor collab editor author) -->

          <author>
            <firstname>NEMETH</firstname>

            <surname>Evi</surname>
          </author>

          <author>
            <firstname>SNYDER</firstname>

            <surname>Garth</surname>
          </author>

          <author>
            <firstname>HEIN</firstname>

            <surname>Trent H.</surname>
          </author>
        </authorgroup>

        <title>Linux Administration Handbook</title>

        <edition>Prentice Hall PTR</edition>

        <date>2002</date>
      </biblioentry>
    </bibliodiv>
  </bibliography>
</article>
