Ceci est une ancienne révision du document !


Dernière mise-à-jour : 2020/01/30 03:36

SO205 - Gestion des Processus et des Tâches

Gestion des Processus

Un processus est un fichier binaire ( binary file ) qui est chargé en mémoire centrale. Une fois chargé la mémoire exécute le programme en langage machine. Quand le programme est chargé, il a besoin du système d’exploitation qui lui fournit des informations pour qu’il puisse s’exécuter correctement. Ces informations sont appelées des données d’identification.

L’ensemble des données d’identification est appelé l’environnement de processus :

  • Un numéro de processus unique (PID),
  • Un numéro de processus parent (PPID),
  • Un numéro d'utilisateur (UID),
  • Un numéro de groupe (GID),
  • La durée de traitement,
  • La priorité du processus,
  • Le répertoire de travail actif,
  • Les fichiers ouverts.

Ces informations sont stockés dans le répertoire /proc.

Système de fichiers /proc

Le répertoire /proc contient des fichiers et des répertoires virtuels. Le contenu de ces fichiers est créé dynamiquement lors de la consultation. Seul root peut consulter la totalité des informations dans le répertoire /root.

Pour commencer l'étude de /proc, saisissez la commande suivante :

# cd /proc; ls -d [0-9]* [Entrée]

Vous obtiendrez un résultat simialire à celui-ci :

# cd /proc; ls -d [0-9]*
0     1028  121   1296  1577  1652  370   397   432   543   570   596   659   718   724   893   928   949   984
1     1038  124   1321  1578  183   373   398   435   544   583   599   670   719   795   9     930   956   996
1006  1046  126   1322  1646  2     374   419   519   551   584   603   671   720   800   905   933   958
1016  1079  1275  140   1650  3     391   421   52    562   594   607   7     721   875   913   935   960
1026  1080  1290  1550  1651  367   392   431   520   568   595   608   709   723   890   925   937   961

Chaque répertoire fait référence à un PID d'un processus.

Commencez par regarder le contenu du répertoire 1.

#cd 1; ls -l [Entrée]

Vous obtiendrez un résultat similaire à celui-ci :

# cd 1; ls -l
total 4417
-rw-------   1 root     root     2211840 mars 17 09:23 as
-r--------   1 root     root         168 mars 17 09:23 auxv
dr-x------   2 root     root          48 mars 17 09:23 contracts
-r--------   1 root     root          32 mars 17 09:23 cred
--w-------   1 root     root           0 mars 17 09:23 ctl
lr-x------   1 root     root           0 mars 17 09:23 cwd ->
dr-x------   2 root     root        8208 mars 17 09:23 fd
-r--------   1 root     root           0 mars 17 09:23 ldt
-r--r--r--   1 root     root         120 mars 17 09:23 lpsinfo
-r--------   1 root     root         816 mars 17 09:23 lstatus
-r--r--r--   1 root     root         536 mars 17 09:23 lusage
dr-xr-xr-x   3 root     root          64 mars 17 09:23 lwp
-r--------   1 root     root        4320 mars 17 09:24 map
dr-x------   2 root     root         800 mars 17 09:23 object
-r--------   1 root     root        5104 mars 17 09:23 pagedata
dr-x------   2 root     root        9008 mars 17 09:23 path
-r--------   1 root     root          72 mars 17 09:23 priv
-r--r--r--   1 root     root         336 mars 17 09:23 psinfo
-r--------   1 root     root        4320 mars 17 09:23 rmap
lr-x------   1 root     root           0 mars 17 09:23 root ->
-r--------   1 root     root        1536 mars 17 09:23 sigact
-r--------   1 root     root        1136 mars 17 09:23 status
-r--r--r--   1 root     root         256 mars 17 09:23 usage
-r--------   1 root     root           0 mars 17 09:23 watch
-r--------   1 root     root        6840 mars 17 09:23 xmap

Les Types de Processus

Il existe trois types de processus :

  • interactif qui est lancé par le shell dans une console en premier plan ou en tâche de fond
  • batch qui est lancé par le système au moment propice
  • daemon qui est lancé au démarrage par le système ( lpd, dns etc )

Un processus peut être dans un de neuf états ou process states :

<note important>

  • user mode - le processus s'exécute en mode utilisateur,
  • kernel mode- le processus s'exécute en mode noyau,
  • waiting – le processus est en attente pour une ressource autre que le processeur,
  • sleeping - le processus est endormi,
  • runnable – le processus dispose de toutes le ressources nécessaire à son exécution sauf le processeur,
  • swap - le processus est endormi dans la mémoire virtuelle,
  • new - le processus est nouveau,
  • elected – le processus a le contrôle du processeur,
  • zombie – le processus a terminé son exécution et est prêt à mourir.

</note>

Les Commandes relatives aux Processus

La commande ps

Cette commande affiche les processus de l’utilisateur attaché au terminal

# ps
   PID TTY         TIME CMD
  1607 pts/4       0:00 ps
  1577 pts/4       0:00 sh
  1578 pts/4       0:00 sh

Utilisez avec l'option f, vous obtiendrez la table des processus :

# ps -f
     UID   PID  PPID   C    STIME TTY         TIME CMD
    root  1608  1578   1 17:51:34 pts/4       0:00 ps -f
    root  1577  1321   0 17:47:17 pts/4       0:00 sh
    root  1578  1577   0 17:47:21 pts/4       0:00 -sh

Dans la table des processus sont stockés les données des processus en cours. On note :

UID User ID Numéro de l’Utilisateur
PID Process Indentification Numéro Unique de Processus
PPID Parent Process ID PID du processus parent
C Priority Priorité instantanée
STIME Start Time Heure de démarrage
TTY Terminal Terminal parent
TIME Duration Durée
CMD Command Commande

Pour visualiser la table des processus de tout le monde, utilisez la commande ps avec les options -f et -e :

# ps -fe
     UID   PID  PPID   C    STIME TTY         TIME CMD
    root     0     0   0 09:23:05 ?           0:24 sched
    root     1     0   0 09:23:06 ?           0:04 /sbin/init
    root     2     0   0 09:23:06 ?           0:00 pageout
    root     3     0   0 09:23:06 ?           1:16 fsflush
    root    52     1   0 09:23:25 ?           0:00 /sbin/dhcpagent
    root     7     1   0 09:23:09 ?           0:24 /lib/svc/bin/svc.startd
    root     9     1   0 09:23:10 ?           1:01 /lib/svc/bin/svc.configd
    root   398     1   0 09:24:19 ?           0:12 /usr/lib/inet/inetd start
    root   583     1   0 09:24:43 ?           0:00 /usr/lib/snmp/snmpdx -y -c /etc/snmp/conf
  daemon   370     1   0 09:24:17 ?           0:01 /usr/lib/nfs/nfsmapid
    root   183     1   0 09:23:47 ?           0:00 /usr/lib/picl/picld
    root   419     1   0 09:24:20 ?           0:01 /usr/lib/utmpd
    root   397   392   0 09:24:19 ?           0:00 /usr/lib/saf/ttymon
  daemon   374     1   0 09:24:17 ?           0:00 /usr/lib/nfs/nfs4cbd
  daemon   367     1   0 09:24:17 ?           0:00 /usr/sbin/rpcbind
    root   126     1   0 09:23:40 ?           2:00 /usr/sbin/nscd
    root   140     1   0 09:23:41 ?           0:00 /usr/lib/power/powerd
  daemon   121     1   0 09:23:39 ?           0:00 /usr/lib/crypto/kcfd
    root   431     1   0 09:24:21 ?           0:00 /usr/sadm/lib/smc/bin/smcboot
    root   124     1   0 09:23:39 ?           0:00 /usr/lib/sysevent/syseventd
    root   543     1   0 09:24:39 ?           0:00 /usr/sbin/vold -f /etc/vold.conf
  daemon   391     1   0 09:24:18 ?           0:00 /usr/lib/nfs/lockd
    root   392     7   0 09:24:19 ?           0:00 /usr/lib/saf/sac -t 300
  daemon   373     1   0 09:24:17 ?           0:00 /usr/lib/nfs/statd
    root   519     1   0 09:24:38 ?           0:00 /usr/lib/autofs/automountd
webservd   595   584   0 09:24:44 ?           0:00 /usr/apache2/bin/httpd -k start
    root   421     7   0 09:24:21 console     0:00 /usr/lib/saf/ttymon -g -d /dev/console -l console -m ldterm,ttcompat -h -p unkn
  nobody   721   709   0 09:24:52 ?           0:00 /usr/apache/bin/httpd
    root   432   431   0 09:24:21 ?           0:00 /usr/sadm/lib/smc/bin/smcboot
    root   435   431   0 09:24:21 ?           0:00 /usr/sadm/lib/smc/bin/smcboot
    root   520   519   0 09:24:38 ?           0:01 /usr/lib/autofs/automountd
    root   709     1   0 09:24:51 ?           1:00 /usr/apache/bin/httpd
  nobody   720   709   0 09:24:52 ?           0:00 /usr/apache/bin/httpd
webservd   594   584   0 09:24:44 ?           0:00 /usr/apache2/bin/httpd -k start
webservd   596   584   0 09:24:44 ?           0:00 /usr/apache2/bin/httpd -k start
    root   568     1   0 09:24:42 ?           0:03 /usr/sfw/sbin/snmpd
    root  1296  1290   7 15:21:50 ?           9:23 /usr/lib/firefox/firefox-bin -UILocale fr-FR -contentLocale FR
    root  1290  1275   0 15:21:50 ?           0:00 /bin/sh /usr/lib/firefox/run-mozilla.sh /usr/lib/firefox/firefox-bin -UILocale
    root   544     1   0 09:24:40 ?           0:01 /usr/sbin/syslogd
    root   551     1   0 09:24:40 ?           0:00 /usr/lib/ssh/sshd
    root   570     1   0 09:24:42 ?           0:08 /usr/lib/fm/fmd/fmd
    root   562     1   0 09:24:41 ?           0:00 devfsadmd
  nobody   723   709   0 09:24:53 ?           0:00 /usr/apache/bin/httpd
    root   584     1   0 09:24:43 ?           0:56 /usr/apache2/bin/httpd -k start
    root   928     1   0 09:25:30 pts/2       0:00 /usr/bin/gnome-keyring-daemon
webservd   599   584   0 09:24:44 ?           0:00 /usr/apache2/bin/httpd -k start
    root   607     1   0 09:24:45 ?           0:00 /usr/lib/dmi/snmpXdmid -s unknown
webservd   608   584   0 09:24:45 ?           0:00 /usr/apache2/bin/httpd -k start
    root   603     1   0 09:24:45 ?           0:00 /usr/lib/dmi/dmispd
    root   935     1   0 09:25:33 ?           0:11 gnome-smproxy --sm-client-id default0
    root   671   659   9 09:24:48 ?          11:12 /usr/X11/bin/Xorg :0 -depth 24 -nobanner -auth /var/dt/A:0-nGaysb
    root   930     1   0 09:25:30 pts/2       0:35 xscreensaver -nosplash
    root   724   659   0 09:24:53 ?           0:00 /usr/dt/bin/dtlogin -daemon
    root   659     1   0 09:24:47 ?           0:00 /usr/dt/bin/dtlogin -daemon
    root   670   659   0 09:24:48 ??          0:00 /usr/openwin/bin/fbconsole -n -d :0
    root   890   800   0 09:25:21 pts/2       0:00 /usr/dt/bin/sdt_shell -c      unset DT;     DISPLAY=:0;       /usr/dt/bin/dt
  nobody   718   709   0 09:24:52 ?           0:00 /usr/apache/bin/httpd
  nobody   719   709   0 09:24:52 ?           0:00 /usr/apache/bin/httpd
    root   800   724   0 09:25:14 ?           0:00 /bin/ksh /usr/dt/bin/Xsession
    root  1321     1   2 15:23:25 ?           1:30 gnome-terminal
    root   949     1   1 09:25:36 ?           0:26 /usr/bin/metacity --sm-client-id=default1
noaccess   795     1   0 09:25:06 ?          11:16 /usr/java/bin/java -server -Xmx128m -XX:+BackgroundCompilation -XX:PermSize=32m
    root   875     1   0 09:25:20 ?           0:07 /usr/dt/bin/dsdm
    root   925     1   1 09:25:27 pts/2       2:30 /usr/lib/gconfd-2 15
    root   893   890   0 09:25:21 pts/2       0:00 -sh -c      unset DT;     DISPLAY=:0;       /usr/dt/bin/dtsession_res -merge
    root  1046     1   0 09:25:49 ?          32:53 /usr/jdk/latest/bin/java -version:1.5+ -jar /usr/lib/patch/swupna.jar -wait
    root   933     1   0 09:25:30 ?           0:01 /usr/lib/bonobo-activation-server --ac-activate --ior-output-fd=23
    root   905   893   0 09:25:23 pts/2       0:00 /bin/ksh /usr/dt/config/Xsession2.jds
    root   913   905   0 09:25:23 pts/2       0:06 /usr/bin/gnome-session
    root   937     1   0 09:25:33 ?           0:09 /usr/lib/gnome-settings-daemon --oaf-activate-iid=OAFIID:GNOME_SettingsDaemon -
    root   956     1   1 09:25:37 ?           3:10 gnome-panel --sm-client-id default2
    root   961   960   0 09:25:38 ?           0:00 gnome-volcheck -i 30 -z 3 -m cdrom,floppy,zip,jaz,dvdrom --sm-client-id default
    root   958     1   1 09:25:37 ?           0:37 nautilus --no-default-window --sm-client-id default3
    root   960     1   0 09:25:38 ?           0:04 gnome-volcheck -i 30 -z 3 -m cdrom,floppy,zip,jaz,dvdrom --sm-client-id default
    root  1322  1321   0 15:23:26 ?           0:00 gnome-pty-helper
    root   984     1   0 09:25:41 ?           0:29 /usr/lib/gnome-vfs-daemon --oaf-activate-iid=OAFIID:GNOME_VFS_Daemon_Factory --
    root  1016     1   1 09:25:45 ?           0:26 /usr/lib/wnck-applet --oaf-activate-iid=OAFIID:GNOME_Wncklet_Factory --oaf-ior-
    root   996     1   0 09:25:42 ?           0:24 /usr/lib/mapping-daemon
    root  1028     1   2 09:25:47 ?           7:21 /usr/lib/mixer_applet2 --oaf-activate-iid=OAFIID:GNOME_MixerApplet_Factory --oa
    root  1006     1   0 09:25:44 ?           0:07 /usr/lib/clock-applet --oaf-activate-iid=OAFIID:GNOME_ClockApplet_Factory --oaf
    root  1275     1   0 15:21:49 ?           0:00 /bin/sh /usr/bin/firefox
    root  1026     1   1 09:25:46 ?           3:19 /usr/lib/gnome-netstatus-applet --oaf-activate-iid=OAFIID:GNOME_NetstatusApplet
    root  1038     1   0 09:25:48 ?           0:04 /usr/lib/notification-area-applet --oaf-activate-iid=OAFIID:GNOME_NotificationA
    root  1079     1   0 09:25:55 ?           0:24 /usr/lib/sendmail -bd -q15m
   smmsp  1080     1   0 09:25:55 ?           0:00 /usr/lib/sendmail -Ac -q15m
    root  1550     1   0 17:41:18 ?           0:00 /usr/sbin/cron
    root  1609  1578   1 17:52:17 pts/4       0:00 ps -fe
    root  1577  1321   0 17:47:17 pts/4       0:00 sh
    root  1578  1577   0 17:47:21 pts/4       0:00 -sh

Les commandes fg et bg

Normalement les commandes s’exécutent en avant plan. Vous pouvez également lancer des processus en arrière plan ou en tâche de fond. La gestion des tâches de fond n'est pas possible en sh. Vous devez donc passez en ksh ou bash. Si vous lancez une commande en tâche de fond, il faut rajouter (espace)& à la fin de la commande

# /usr/bin/ksh [Entrée]
# sleep 9999 & [Entrée]

<note important> Notez qu’un processus en arrière plan est dit asynchrone car il se poursuit indépendamment de son parent qui est le shell. En avant plan le processus est dit synchrone. </note>

Solaris numérote tous les processus qui sont placés en tâches de fond. On parle donc d’un numéro de tâche.

La commande jobs permet de se renseigner sur les processus en arrière plan.

# jobs -l
[1] + 1646       Exécution en cours      sleep 9999 &

<note important> Le numéro de tâche est indiqué entre [crochets] tandis que le PID ne l'est pas. </note>

Si on souhaite envoyer un processus en arrière plan de façon à libérer le shell pour d’autres commandes, il faut d’abord suspendre le processus en question. Normalement on suspend un processus en utilisant la combinaison de touches ^Z.

Pour mieux comprendre, lancez la commande suivante dans une autre fenêtre de console :

# /usr/bin/ksh [Entrée]
# sleep 1234 [Entrée]

Ensuite suspendez ce processus à l'aide de ^Z :

# /usr/bin/ksh
# sleep 1234
^Z[1] + Arrêté (SIGTSTP)         sleep 1234
# jobs -l
[1] + 1652      Arrêté (SIGTSTP)         sleep 1234

Un fois suspendu, on utilise la commande bg (background) pour envoyer le processus en arrière plan :

# bg %n° de tâche [Entrée]

Une fois en arrière plan, le processus continue.

# bg %1
[1]     sleep 1234&
# jobs -l
[1] + 1652       Exécution en cours      sleep 1234

Pour ramener le processus en avant plan, il faut de nouveau interrompre le processus concerné. Or cette fois-ci, nous ne pouvons pas utiliser la commande ^Z. Il faut utiliser la commande kill avec l’opérateur –stop.

# kill -s stop %n° de tâche [Entrée]
# kill -s stop %1
# jobs -l
[1] + 1652      Arrêté (SIGSTOP)         sleep 1234

<note important> Notez bien l'utilisation de la commande jobs -l pour se renseigner sur l'état du processus concerné. </note>

Pour ramener le processus en avant plan, on utilise la commande fg :

# fg %n° de tâche [Entrée]
# fg %1
sleep 1234

La commande wait

Cette commande permet de transformer une commande asynchrone en synchrone. Elle est utilisée pour attendre jusqu’à ce que les processus en tâches de fond soient terminés :

# wait %n° de tâche [Entrée]

Par exemple :

# jobs -l
[1] + 1646       Exécution en cours      sleep 9999 &
# wait %1

La commande nice

Cette commande modifie la priorité d’un processus. La priorité par défaut de nice est 20. La plage des valeurs de NOMBRE est de 0 à 40 où 0 est la plus prioritaire. La syntaxe de cette commande est :

# nice -n +/-NOMBRE COMMANDE

La commande renice

Cette commande modifie la priorité d’un processus déjà en cours. La valeur de la priorité ne peut être modifiée que par le propriétaire du processus ou par root. La syntaxe de cette commande est :

# renice -n +/-NOMBRE -p PID

La plage des valeurs de NOMBRE est de 0 à 39. La valeur de NOMBRE est ajouter ou déduit de la valeur par défaut, soit 20.

<note important> Il est à noter que seul root peut décrémenter la valeur de priorité avec la commande renice. </note>

La commande nohup

Cette commande permet à un processus de poursuivre son exécution après la déconnexion. Un processus enfant meurt quand le processus parent meure ou se termine. Comme une connexion et un processus, quand vous vous déconnectez, vos processus se terminent. Pour éviter de rester connecté après avoir lancé un processus long, vous utiliserez la commande nohup :

# nohup sort ventes & [Entrée]

La commande kill

Cette commande est utilisée pour arrêter un processus. Elle est à utiliser avec le PID.

# kill PID1 PID2 [Entrée]

La commande kill envoie des signaux aux processus. La liste des signaux possibles peut être afficher avec la commande :

# kill -l [Entrée]

Vous constaterez une liste des signaux possibles :

Sous ksh :

# kill -l
EXIT HUP INT QUIT ILL TRAP ABRT EMT FPE KILL BUS SEGV SYS PIPE ALRM TERM USR1 USR2 CLD PWR WINCH URG POLL STOP TSTP CONT TTIN TTOU VTALRM PROF XCPU XFSZ WAITING LWP FREEZE THAW CANCEL LOST XRES JVM1 JVM2 RTMIN RTMIN+1 RTMIN+2 RTMIN+3 RTMAX-3 RTMAX-2 RTMAX-1 RTMAX

Sous bash :

# /usr/bin/bash
bash-3.00# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGEMT       8) SIGFPE
 9) SIGKILL     10) SIGBUS      11) SIGSEGV     12) SIGSYS
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGUSR1
17) SIGUSR2     18) SIGCHLD     19) SIGPWR      20) SIGWINCH
21) SIGURG      22) SIGIO       23) SIGSTOP     24) SIGTSTP
25) SIGCONT     26) SIGTTIN     27) SIGTTOU     28) SIGVTALRM
29) SIGPROF     30) SIGXCPU     31) SIGXFSZ     32) SIGWAITING
33) SIGLWP      34) SIGFREEZE   35) SIGTHAW     36) SIGCANCEL
37) SIGLOST     41) SIGRTMIN    42) SIGRTMIN+1  43) SIGRTMIN+2
44) SIGRTMIN+3  45) SIGRTMAX-3  46) SIGRTMAX-2  47) SIGRTMAX-1
48) SIGRTMAX

Les commandes procTools

pcred

Cette commande affiche le propriétaire d'un processus :

# pcred 1
1:      e/r/suid=0  e/r/sgid=0

pfiles

Cette commande indique les fichiers ouverts :

# pfiles 1
1:      /sbin/init
  Current rlimit: 256 file descriptors
   0: S_IFIFO mode:0600 dev:102,0 ino:44720 uid:0 gid:0 size:0
      O_RDWR|O_NDELAY
      /etc/initpipe
 253: S_IFREG mode:0444 dev:275,1 ino:65538 uid:0 gid:0 size:0
      O_RDONLY|O_LARGEFILE FD_CLOEXEC
      /system/contract/process/pbundle
 254: S_IFREG mode:0666 dev:275,1 ino:65539 uid:0 gid:0 size:0
      O_RDWR|O_LARGEFILE FD_CLOEXEC
      /system/contract/process/template
 255: S_IFREG mode:0666 dev:275,1 ino:65539 uid:0 gid:0 size:0
      O_RDWR|O_LARGEFILE FD_CLOEXEC
      /system/contract/process/template

pflags

Cette commande donne des informations d'état :

# pflags 1
1:      /sbin/init
        data model = _ILP32  flags = ORPHAN|MSACCT|MSFORK
 /1:    flags = ASLEEP  pollsys(0x806a458,0x1,0x8047610,0x0)

pldd

Cette commande liste les libraires dynamiques utilisées :

# pldd 1
1:      /sbin/init
/lib/libpam.so.1
/lib/libbsm.so.1
/lib/libcontract.so.1
/lib/libc.so.1
/lib/libcmd.so.1
/lib/libsocket.so.1
/lib/libnsl.so.1
/lib/libmd.so.1
/lib/libsecdb.so.1
/lib/libnvpair.so.1
/lib/libscf.so.1
/lib/libdoor.so.1
/lib/libuutil.so.1
/lib/libgen.so.1

pmap

Cette commande indique l'espace d'adressage :

# pmap 1
1:      /sbin/init
08046000       8K rw---    [ stack ]
08050000      36K r-x--  /sbin/init
08069000       8K rw---  /sbin/init
0806B000      24K rw---    [ heap ]
D0470000      24K r-x--  /lib/libgen.so.1
D0486000       4K rw---  /lib/libgen.so.1
D0490000      24K r-x--  /lib/libuutil.so.1
D04A6000       4K rw---  /lib/libuutil.so.1
D04B0000       4K r-x--  /lib/libdoor.so.1
D04C1000       4K rw---  /lib/libdoor.so.1
D04D0000      88K r-x--  /lib/libscf.so.1
D04F6000       4K rw---  /lib/libscf.so.1
D0500000      24K rwx--    [ anon ]
D0510000      24K r-x--  /lib/libnvpair.so.1
D0526000       4K rw---  /lib/libnvpair.so.1
D0530000      12K r-x--  /lib/libsecdb.so.1
D0543000       4K rw---  /lib/libsecdb.so.1
D0550000      56K r-x--  /lib/libmd.so.1
D056E000       4K rw---  /lib/libmd.so.1
D0570000     516K r-x--  /lib/libnsl.so.1
D0601000      20K rw---  /lib/libnsl.so.1
D0606000      32K rw---  /lib/libnsl.so.1
D0610000      44K r-x--  /lib/libsocket.so.1
D062B000       4K rw---  /lib/libsocket.so.1
D0630000      12K r-x--  /lib/libcmd.so.1
D0643000       4K rw---  /lib/libcmd.so.1
D0650000     756K r-x--  /lib/libc.so.1
D071D000      28K rw---  /lib/libc.so.1
D0724000       8K rw---  /lib/libc.so.1
D0730000      16K r-x--  /lib/libcontract.so.1
D0740000       4K rwx--    [ anon ]
D0744000       4K rw---  /lib/libcontract.so.1
D0750000     116K r-x--  /lib/libbsm.so.1
D077D000      16K rw---  /lib/libbsm.so.1
D0781000       4K rw---  /lib/libbsm.so.1
D0790000      24K r-x--  /lib/libpam.so.1
D07A0000       4K rwx--    [ anon ]
D07A6000       4K rw---  /lib/libpam.so.1
D07B0000       4K rwx--    [ anon ]
D07B2000       4K rwxs-    [ anon ]
D07C0000       4K rwx--    [ anon ]
D07C5000     156K r-x--  /lib/ld.so.1
D07F0000       4K rwx--    [ anon ]
D07FC000       8K rwx--  /lib/ld.so.1
D07FE000       4K rwx--  /lib/ld.so.1
 total      2160K

pstack

Cette commande indique la pile d'exécution :

# pstack 1
1:      /sbin/init
 d06f45a7 pollsys  (806a458, 1, 8047610, 0)
 d069e79e poll     (806a458, 1, 493e0) + 52
 08053815 main     (1, 8047f6c, 8047f74) + 3eb
 08053346 ???????? (1, 8047fe0, 0, 0, 7d8, 8047feb)

ptree

Cette commande démontre un arbre de parents et de fils du processus :

# ptree
7     /lib/svc/bin/svc.startd
  392   /usr/lib/saf/sac -t 300
    397   /usr/lib/saf/ttymon
  421   /usr/lib/saf/ttymon -g -d /dev/console -l console -m ldterm,ttcompat -h -p unkn
9     /lib/svc/bin/svc.configd
52    /sbin/dhcpagent
121   /usr/lib/crypto/kcfd
124   /usr/lib/sysevent/syseventd
126   /usr/sbin/nscd
140   /usr/lib/power/powerd
183   /usr/lib/picl/picld
367   /usr/sbin/rpcbind
370   /usr/lib/nfs/nfsmapid
373   /usr/lib/nfs/statd
374   /usr/lib/nfs/nfs4cbd
391   /usr/lib/nfs/lockd
398   /usr/lib/inet/inetd start
419   /usr/lib/utmpd
431   /usr/sadm/lib/smc/bin/smcboot
  432   /usr/sadm/lib/smc/bin/smcboot
  435   /usr/sadm/lib/smc/bin/smcboot
519   /usr/lib/autofs/automountd
  520   /usr/lib/autofs/automountd
543   /usr/sbin/vold -f /etc/vold.conf
544   /usr/sbin/syslogd
551   /usr/lib/ssh/sshd
562   devfsadmd
568   /usr/sfw/sbin/snmpd
570   /usr/lib/fm/fmd/fmd
583   /usr/lib/snmp/snmpdx -y -c /etc/snmp/conf
584   /usr/apache2/bin/httpd -k start
  594   /usr/apache2/bin/httpd -k start
  595   /usr/apache2/bin/httpd -k start
  596   /usr/apache2/bin/httpd -k start
  599   /usr/apache2/bin/httpd -k start
  608   /usr/apache2/bin/httpd -k start
603   /usr/lib/dmi/dmispd
607   /usr/lib/dmi/snmpXdmid -s unknown
659   /usr/dt/bin/dtlogin -daemon
  670   /usr/openwin/bin/fbconsole -n -d :0
  671   /usr/X11/bin/Xorg :0 -depth 24 -nobanner -auth /var/dt/A:0-nGaysb
  724   /usr/dt/bin/dtlogin -daemon
    800   /bin/ksh /usr/dt/bin/Xsession
      890   /usr/dt/bin/sdt_shell -c       unset DT;      DISPLAY=:0;        /usr/dt/bin/dt
        893   -sh -c       unset DT;      DISPLAY=:0;        /usr/dt/bin/dtsession_res -merge
          905   /bin/ksh /usr/dt/config/Xsession2.jds
            913   /usr/bin/gnome-session
709   /usr/apache/bin/httpd
  718   /usr/apache/bin/httpd
  719   /usr/apache/bin/httpd
  720   /usr/apache/bin/httpd
  721   /usr/apache/bin/httpd
  723   /usr/apache/bin/httpd
795   /usr/java/bin/java -server -Xmx128m -XX:+BackgroundCompilation -XX:PermSize=32m
875   /usr/dt/bin/dsdm
925   /usr/lib/gconfd-2 15
928   /usr/bin/gnome-keyring-daemon
930   xscreensaver -nosplash
933   /usr/lib/bonobo-activation-server --ac-activate --ior-output-fd=23
935   gnome-smproxy --sm-client-id default0
937   /usr/lib/gnome-settings-daemon --oaf-activate-iid=OAFIID:GNOME_SettingsDaemon -
949   /usr/bin/metacity --sm-client-id=default1
956   gnome-panel --sm-client-id default2
958   nautilus --no-default-window --sm-client-id default3
960   gnome-volcheck -i 30 -z 3 -m cdrom,floppy,zip,jaz,dvdrom --sm-client-id default
  961   gnome-volcheck -i 30 -z 3 -m cdrom,floppy,zip,jaz,dvdrom --sm-client-id default
984   /usr/lib/gnome-vfs-daemon --oaf-activate-iid=OAFIID:GNOME_VFS_Daemon_Factory --
996   /usr/lib/mapping-daemon
1006  /usr/lib/clock-applet --oaf-activate-iid=OAFIID:GNOME_ClockApplet_Factory --oaf
1016  /usr/lib/wnck-applet --oaf-activate-iid=OAFIID:GNOME_Wncklet_Factory --oaf-ior-
1026  /usr/lib/gnome-netstatus-applet --oaf-activate-iid=OAFIID:GNOME_NetstatusApplet
1028  /usr/lib/mixer_applet2 --oaf-activate-iid=OAFIID:GNOME_MixerApplet_Factory --oa
1038  /usr/lib/notification-area-applet --oaf-activate-iid=OAFIID:GNOME_NotificationA
1046  /usr/jdk/latest/bin/java -version:1.5+ -jar /usr/lib/patch/swupna.jar -wait
1079  /usr/lib/sendmail -bd -q15m
1080  /usr/lib/sendmail -Ac -q15m
1275  /bin/sh /usr/bin/firefox
  1290  /bin/sh /usr/lib/firefox/run-mozilla.sh /usr/lib/firefox/firefox-bin -UILocale
    1296  /usr/lib/firefox/firefox-bin -UILocale fr-FR -contentLocale FR
1321  gnome-terminal
  1322  gnome-pty-helper
  1577  sh
    1578  -sh
      1792  ptree
  1650  sh
    1651  /usr/bin/ksh
1550  /usr/sbin/cron
1646  sleep 9999

pwdx

Cette commande indique le répertoire courant du processus :

# pwdx 1
1:      /

Gestion des crash dump

Le termination anormale d'un processus génére un crash dump avec la création de fichiers process core dump.

Lors d'une anomolie critique, Solaris appelle la routine panic(). Cette routine interompe tous les processus et crée les fichiers system core dump unix.<X> et vmcore.<X> dans le périphérique de vidage. Ensuite Solaris utilise la commande savecore pour déplacer les fichiers core dump vers le répertoire Savecore lors du démarrage suivant.

Pour administrer les crash dumps, il convient d'utiliser la commande dumpadm :

# dumpadm
      Contenu de vidage : noyau pages
       Périphérique de vidage : /dev/dsk/c0d0s1 (échange)
Répertoire Savecore : /var/crash/unknown
  Savecore activé : oui

Dans la sortie de la commande, on peut noter :

  • le contenu de vidage est les pages mémoire du noyau,
  • le périphérique de vidage est la tranche swap,
  • les fichiers core dump seront écrits dans /var/crash/unknown,
  • crash dump est activée.

Pour désactiver les crash dump il convient d'utiliser la commande dumpadm avec l'option -n :

# dumpadm -n
      Contenu de vidage : noyau pages
       Périphérique de vidage : /dev/dsk/c0d0s1 (échange)
Répertoire Savecore : /var/crash/unknown
  Savecore activé : non

Pour activer les crash dump il convient d'utiliser la commande dumpadm avec l'option -y :

# dumpadm -y
      Contenu de vidage : noyau pages
       Périphérique de vidage : /dev/dsk/c0d0s1 (échange)
Répertoire Savecore : /var/crash/unknown
  Savecore activé : oui

Pour modifier la configuration des crash dump, il convient de stipuler les options adéquates :

dumpadm -c contenu -d dump-device -m nnnk | nnnm | nnn% -n -s rép-savecore

Dans cette ligne de commande on peut noter les options suivantes :

  • contenu,
    • kernel - la mémoire du noyau,
    • all - toute la mémoire,
    • curproc - la mémoire du noyau plus celle du processus en exécution au moment du crash,
  • dump-device,
    • le device qui stocke les données du dump,
    • la valeur par défaut est la partition swap primaire,
  • -m
    • nnnk - indique le nombre de Ko qui ne peuvent pas être utilisés par les fichiers core dump,
    • nnnm - indique le nombre de Mo qui ne peuvent pas être utilisés par les fichiers core dump,
    • nnn% - indique le pourcentage du filesystem qui ne peuvent pas être utilisés par les fichiers core dump,
  • -n
    • spécifie que la commande savecore ne doit pas s'exécuter lors du re-démarrage du système,
    • cette option est fortement déconseillée car l'information du crash dump sera écrasée quand le système commence à utiliser le swap,
  • -s
    • indique un répertoire alternatif pour le stockage des fichiers core dump,
    • par défaut la valeur de rép-savecore est /var/crash/hostname.

Exécutez donc la commande suivante pour modifier la configuration des crash dump :

# dumpadm -c kernel -d /dev/dsk/c0d0s1 -m 10%
      Contenu de vidage : noyau pages
       Périphérique de vidage : /dev/dsk/c0d0s1 (échange)
Répertoire Savecore : /var/crash/unknown (minfree = 561531Ko)
  Savecore activé : oui

<note> Expliquez la signification des options. </note>

Utilisez maintenant la commande gcore pour forcer un core dump du processus de votre terminal :

# gcore $$
gcore: core.1118 dumped

Le fichier core.PID est sauvegardé dans le répertoire courant.

Utilisez maintenant la commande pstack pour visualiser le stack du processus :

# pstack core.1118
core 'core.1118' of 1118:       sh
 d0774b57 waitid   (0, 49f, 8047340, 83)
 d0769688 waitpid  (49f, 8047400, 80) + 75
 0805e85d ???????? (80774e0)
 0805f140 postjob  (49f, 1) + ce
 08059ba2 execute  (807798c, 0, 0) + 70a
 080605eb ???????? (0)
 08060467 main     (1, 80474c8, 80474d0) + 4af
 080551c6 ???????? (1, 8047604, 0, 8047607, 8047619, 8047632)

La commande mdb indique le processus générateur du fichier crash dump ainsi que la commande utilisée pour le générer :

# mdb core.1118
Loading modules: [ libc.so.1 ld.so.1 ]
> ::status
debugging core file of sh (32-bit) from unknown
file: /sbin/sh
initial argv: sh
threading model: multi-threaded
status: process core file generated with gcore(1)

Durée approximative : 1 heure

Gestion des Tâches sous Solaris

cron

Le démon cron est normalement lancé au démarrage de la machine. Ce service est chargé de faire exécuter des tâches ( commandes et scripts ) à des moments précis.

Le service cron lit toutes les minutes les fichiers propres à chaque utilisateur qui se trouvent dans /var/spool/cron/crontabs/ et qui sont au nom de chaque utilisateur.

Par exemple, le fichier propre à l'utilisateur fenestros est le fichier /var/spool/cron/crontabs/fenestros.

Le service cron exécute des tâches en rajoutant une ligne dans le fichier /var/cron/log. Si une commande produit une sortie, celle-ci est dirigée vers la messagerie.

L'utilisation de cron est réservé à root. Cependant, vous pouvez établir une liste d'utilisateurs qui ont la permission d'utiliser cron en créant un fichier nommé cron.allow dans /etc/cron.d/. A l'inverse, un fichier cron.deny peut contenir une liste d'utilisateurs qui n'ont pas la permission d'utiliser cron. Par défaut, Solaris a un fichier cron.deny :

# cat /etc/cron.d/cron.deny
daemon
bin
nuucp
listen
nobody
noaccess

<note important> Il est à noter ici que le service cron présume que la machine est allumée en permanence. </note>

Quand le démon cron exécute la commande dans un fichier crontab, il définit un environnement réduit comprenant les variables HOME, LOGNAME, SHELL , qui est définit par défaut en /bin/sh et PATH. Le variable PATH est définit en tant que /bin:/usr/bin mais peut être modifiée par l'édition du fichier /etc/default/cron :

# cat /etc/default/cron
CRONLOG=YES

Ce fichier peut contenir donc les définitions du PATH pour les utilisateurs et de SUPATH pour root.

Chaque ligne dans un fichier crontab contient 5 champs temporels qui décrivent le périodicité de l'exécution de la tâche concernée.

Les 5 champs sont :

Minutes Heures Jour du mois Mois de l'année Jour de la sem.
(0-59) (0-23) (1-31) (1-12) (0-6)*

* le 0 correspond à dimanche.

Les champs temporels peuvent contenir des valeurs différentes :

Exemple Description
Une valeur absolue telle 10 Dans le champs minutes = 10 minutes après l'heure
Une série de valeurs telle 2,6,8 Dans le champs mois = février, juin et août
Une intervalle telle 1-5 Dans le champs Jour de la Semaine = du lundi au vendredi
Le joker * Dans le champs minutes = toutes les minutes
Une périodicité telle 0-23/2 Dans le champs heures = toutes les deux heures

Dans notre cas nous souhaitons confier à cron la gestion des mises à jour des définitions de virus ainsi que la vérification du répertoire /export/home au quotidien.

Afin de faire ceci, nous allons éditer le fichier crontab de root. Pour vérifier s'il existe une version de crontab existante pour root, il convient de lancer la commande suivante :

# crontab -l
#ident  "@(#)root       1.21    04/03/23 SMI"
#
# The root crontab should be used to perform accounting data collection.
#
#
10 3 * * * /usr/sbin/logadm
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean
#
# The rtc command is run to adjust the real time clock if and when
# daylight savings time changes.
#
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
#10 3 * * * /usr/lib/krb5/kprop_script ___slave_kdcs___

Afin de créer ou éditer un fichier crontab, il convient d'utiliser la commande crontab avec l'option -e. Cette commande lance l'interface de l'éditeur définit par la variable $EDITOR. Actuellement, root ne dispose pas de fichier .profile. Commençons donc par créer ce fichier à la racine du système de fichiers :

# vi .profile [Entrée]

Editez le fichier ainsi :

EDITOR=/usr/bin/vi
export EDITOR

Sauvegardez votre fichier puis ré-amorcez votre Solaris. Ouvrez de nouveau une session root et vérifiez que votre éditeur est bien VI :

# echo $EDITOR
/usr/bin/vi

Nous pouvons maintenant éditer le crontab de root :

# crontab -e [Entrée] 

Vous obtiendrez un résultat similaire à celui-ci :

#ident  "@(#)root       1.21    04/03/23 SMI"
#
# The root crontab should be used to perform accounting data collection.
#
#
10 3 * * * /usr/sbin/logadm
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean
#
# The rtc command is run to adjust the real time clock if and when
# daylight savings time changes.
#
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
#10 3 * * * /usr/lib/krb5/kprop_script ___slave_kdcs___
#
~
~
~
~
~
~
~
~
"/tmp/crontab.raOOv" 15 lignes, 484 caractères

Passez en mode EDITION. Tapez ensuite le texte suivant à la fin de votre fichier :

10 23 * * * /opt/csw/bin/freshclam
20 23 * * * /opt/csw/bin/clamscan -r /export/home

Sauvegardez et quittez vi.

A l'examen du fichier /var/spool/cron/crontabs/root, vous verrez que votre modification a bien été prise en compte :

# cd /var/spool/cron/crontabs
# ls
adm   lp    root  sys   uucp
# cat root
#ident  "@(#)root       1.21    04/03/23 SMI"
#
# The root crontab should be used to perform accounting data collection.
#
#
10 3 * * * /usr/sbin/logadm
15 3 * * 0 /usr/lib/fs/nfs/nfsfind
30 3 * * * [ -x /usr/lib/gss/gsscred_clean ] && /usr/lib/gss/gsscred_clean
#
# The rtc command is run to adjust the real time clock if and when
# daylight savings time changes.
#
1 2 * * * [ -x /usr/sbin/rtc ] && /usr/sbin/rtc -c > /dev/null 2>&1
#10 3 * * * /usr/lib/krb5/kprop_script ___slave_kdcs___
10 23 * * * /opt/csw/bin/freshclam
20 23 * * * /opt/csw/bin/clamscan -r /export/home
#

<note> Créez un crontab pour l'utilisateur test. Le crontab doit contenir la ligne * * * * * /bin/pwd > pwd.txt. Constatez la création du fichier pwd.txt. Ensuite inscrivez le nom de l'utilisateur test dans le fichier /etc/cron.d/cron.deny. Essayez d'éditer le crontab en tant que l'utilisateur test et en utilisant la commande crontab -e. Que constatez-vous ? Supprimez le fichier pwd.txt créé par ce crontab. Est'ce que le job du crontab de test continue de fonctionner ? </note>

at

Tout comme avec la commande cron, root a la possibilité d'accorder ou d'interdire aux utilisateurs le droit d'exécuter des tâches avec at en utilisant les deux fichiers suivants :

  • /etc/cron.d/at.allow
  • /etc/cron.d/at.deny

<note important> Si le fichier at.allow existe, seuls les utilisateurs dans ce fichier pourront exécuter at. </note>

Pour mettre en place une tâche at, vous devez indiquer au système à quel moment cette tâche doit avoir lieu. Dans l'exemple qui suit, vous mettrez en place une tâche qui s'exécutera 3 minutes après la saisie :

# at now +3 minutes [Entrée]
at> pwd > /tmp/test.atd [Entrée]
at> [^D] [Entrée]
at> <EOT>
les commandes seront exécutées avec /sbin/sh
tâche 1212489663.a à mar. juin  3 12:41:03 2008

Vérifiez ensuite la présence de la tâche :

# at -l
user = root     1212489663.a    mar. juin  3 12:41:03 2008

A l'issu des trois minutes, vérifiez le contenu du fichier /tmp/test.atd :

# cat /tmp/test.atd
/var/spool/cron/crontabs

Mettez en place maintenant deux tâches pour le 31/12/2012 à 13h00 et 14h00 respectivement :

# at 13:00 Dec 31 [Entrée]
at> pwd > /tmp/test13.atd [Entrée]
at> [^D] [Entrée]
at> <EOT> 
les commandes seront exécutées avec /sbin/sh
tâche 1230724800.a à lun. déc. 31 13:00:00 2012
# at 14:00 Dec 31 [Entrée]
at> vmstat > /tmp/test14.atd [Entrée]
at> [^D] [Entrée]
at> <EOT>
les commandes seront exécutées avec /sbin/sh
tâche 1230728400.a à lun. déc. 31 14:00:00 2012

Il existent maintenant deux tâches :

# at -l
user = root     1230724800.a    lun. déc. 31 13:00:00 2012
user = root     1230728400.a    lun. déc. 31 14:00:00 2012

Les fichiers concernant ces deux tâches sont stockés dans le répertoire /var/spool/cron/atjobs :

# cd /var/spool/cron/atjobs
# ls
1230724800.a  1230728400.a

A l'examen du deuxième fichier, vous constaterez un résultat similaire à celui-ci :

# cat 1230724800.a
: at job
: jobname: stdin
: notify by mail: no
: project: 1
export AB_CARDCATALOG; AB_CARDCATALOG='/usr/dt/share/answerbooks/fr_FR.ISO8859-15/ab_cardcatalog'
export COLORTERM; COLORTERM='gnome-terminal'
export DISPLAY; DISPLAY=':0.0'
export DTAPPSEARCHPATH; DTAPPSEARCHPATH='//.dt/appmanager:/usr/dt/appconfig/appmanager/%L:/usr/dt/appconfig/appmanager/C'
export DTDATABASESEARCHPATH; DTDATABASESEARCHPATH='//.dt/types,/usr/dt/appconfig/types/%L,/usr/dt/appconfig/types/C'
export DTDEVROOT; DTDEVROOT=''
export DTHELPSEARCHPATH; DTHELPSEARCHPATH='//.dt/help/root-poste-0/%H://.dt/help/root-poste-0/%H.sdl://.dt/help/root-poste-0/%H.hv://.dt/help/%H://.dt/help/%H.sdl://.dt/help/%H.hv:/usr/dt/appconfig/help/%L/%H:/usr/dt/appconfig/help/%L/%H.sdl:/usr/dt/appconfig/help/%L/%H.hv:/usr/dt/appconfig/help/C/%H:/usr/dt/appconfig/help/C/%H.sdl:/usr/dt/appconfig/help/C/%H.hv'
export DTSCREENSAVERLIST; DTSCREENSAVERLIST='StartDtscreenSwarm StartDtscreenQix     StartDtscreenFlame StartDtscreenHop StartDtscreenImage StartDtscreenLife   StartDtscreenRotor StartDtscreenPyro StartDtscreenWorm StartDtscreenBlank'
export DTSOURCEPROFILE; DTSOURCEPROFILE='true'
export DTUSERSESSION; DTUSERSESSION='root-poste-0'
export DTXSERVERLOCATION; DTXSERVERLOCATION='local'
export EDITOR; EDITOR='/usr/bin/vi'
export ENV; ENV='/etc/kshrc'
export GNOME_DESKTOP_SESSION_ID; GNOME_DESKTOP_SESSION_ID='Default'
export GNOME_KEYRING_SOCKET; GNOME_KEYRING_SOCKET='/var/tmp/keyring-7QKZ1k/socket'
export GTK_RC_FILES; GTK_RC_FILES='/etc/gtk/gtkrc://.gtkrc-1.2-gnome2'
export G_BROKEN_FILENAMES; G_BROKEN_FILENAMES='yes'
export G_FILENAME_ENCODING; G_FILENAME_ENCODING='@locale,UTF-8'
export HELPPATH; HELPPATH='/usr/openwin/lib/locale:/usr/openwin/lib/help'
export HOME; HOME='/'
export LANG; LANG='fr_FR.ISO8859-15'
export LC_COLLATE; LC_COLLATE='fr_FR.ISO8859-15'
export LC_CTYPE; LC_CTYPE='fr_FR.ISO8859-15'
export LC_MESSAGES; LC_MESSAGES='fr_FR.ISO8859-15'
export LC_MONETARY; LC_MONETARY='fr_FR.ISO8859-15'
export LC_NUMERIC; LC_NUMERIC='fr_FR.ISO8859-15'
export LC_TIME; LC_TIME='fr_FR.ISO8859-15'
export LOGNAME; LOGNAME='root'
export MAIL; MAIL='/var/mail/root'
export MANPATH; MANPATH='/usr/dt/man:/usr/man:/usr/openwin/share/man'
export OPENWINHOME; OPENWINHOME='/usr/openwin'
export PATH; PATH='/usr/sbin:/usr/bin:/usr/openwin/bin:/usr/ucb'
export PWD; PWD='/'
export SDT_NO_DTDBCACHE; SDT_NO_DTDBCACHE='1'
export SDT_NO_TOOLTALK; SDT_NO_TOOLTALK='1'
export SESSIONTYPE; SESSIONTYPE='altDt'
export SESSION_MANAGER; SESSION_MANAGER='local/poste:/tmp/.ICE-unix/18296,inet6/poste:33063,inet/poste:33064'
export SESSION_SVR; SESSION_SVR='poste'
export SHELL; SHELL='/sbin/sh'
export START_SPECKEYSD; START_SPECKEYSD='no'
export TERM; TERM='xterm'
export TZ; TZ='Europe/Paris'
export USER; USER='root'
export WINDOWID; WINDOWID='46137391'
export XFILESEARCHPATH; XFILESEARCHPATH='/usr/openwin/lib/locale/%L/%T/%N%S:/usr/openwin/lib/%T/%N%S'
export XMBINDDIR; XMBINDDIR='/usr/dt/lib/bindings'
export XMICONBMSEARCHPATH; XMICONBMSEARCHPATH='//.dt/icons/%B%M.bm://.dt/icons/%B%M.pm://.dt/icons/%B:/usr/dt/appconfig/icons/%L/%B%M.bm:/usr/dt/appconfig/icons/%L/%B%M.pm:/usr/dt/appconfig/icons/%L/%B:/usr/dt/appconfig/icons/C/%B%M.bm:/usr/dt/appconfig/icons/C/%B%M.pm:/usr/dt/appconfig/icons/C/%B'
export XMICONSEARCHPATH; XMICONSEARCHPATH='//.dt/icons/%B%M.pm://.dt/icons/%B%M.bm://.dt/icons/%B:/usr/dt/appconfig/icons/%L/%B%M.pm:/usr/dt/appconfig/icons/%L/%B%M.bm:/usr/dt/appconfig/icons/%L/%B:/usr/dt/appconfig/icons/C/%B%M.pm:/usr/dt/appconfig/icons/C/%B%M.bm:/usr/dt/appconfig/icons/C/%B'
export _; _='/usr/bin/gnome-session'
export dtstart_sessionlogfile; dtstart_sessionlogfile='/dev/null'
$SHELL << '...the rest of this file is shell input'
#ident  "@(#).proto     1.6     00/05/01 SMI"   /* SVr4.0 1.2   */
cd /var/spool/cron/crontabs
umask 22
ulimit unlimited
pwd > /tmp/test13.atd

Pour supprimer cette tâche il convient d'utiliser la commande suivante :

# at -r N° de tâche [Entrée]

Par exemple :

# at -l
user = root     1230724800.a    mer. déc. 31 13:00:00 2009
user = root     1230728400.a    mer. déc. 31 14:00:00 2009
# at -r 1230724800.a
# at -l
user = root     1230728400.a    mer. déc. 31 14:00:00 2009

Finalement, pour exécuter plusieurs commandes à la même heure d'une manière séquentielle, vous pouvez les insérer dans un fichier :

# at 10:00 < todo.txt [Entrée]

Par exemple :

# touch todo.list
# echo pwd > todo.list
# echo free >> todo.list
# echo who >> todo.list
# at 14:30 Dec 31 < todo.list
les commandes seront exécutées avec /sbin/sh
tâche 1356960600.a à lun. déc  31 14:30:00 2012

<html> <center> Copyright © 2011-2018 I2TCH LIMITED.<br><br> </center> </html>

Menu