Ceci est une ancienne révision du document !


Version : 2020.01

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]*
0    142  279  372  390  424  471  569  611  669  698  751  816
1    144  3    373  4    434  473  587  653  67   719  771  822
11   149  352  374  420  442  5    594  654  677  726  813  9
113  2    367  382  423  469  568  609  657  691  728  815

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
total 5211
-rw-------   1 root     root     2617344 Jan 14 12:44 as
-r--------   1 root     root         168 Jan 14 12:44 auxv
dr-x------   2 root     root          48 Jan 14 12:44 contracts
-r--------   1 root     root          32 Jan 14 12:44 cred
--w-------   1 root     root           0 Jan 14 12:44 ctl
lr-x------   1 root     root           0 Jan 14 12:44 cwd -> 
dr-x------   2 root     root        8208 Jan 14 12:44 fd
-r--------   1 root     root           0 Jan 14 12:44 ldt
-r--r--r--   1 root     root         120 Jan 14 12:44 lpsinfo
-r--------   1 root     root         816 Jan 14 12:44 lstatus
-r--r--r--   1 root     root         536 Jan 14 12:44 lusage
dr-xr-xr-x   3 root     root          64 Jan 14 12:44 lwp
-r--------   1 root     root        4608 Jan 14 12:44 map
dr-x------   2 root     root         800 Jan 14 12:44 object
-r--------   1 root     root        5504 Jan 14 12:44 pagedata
dr-x------   2 root     root        9008 Jan 14 12:44 path
-r--------   1 root     root          72 Jan 14 12:44 priv
-r--r--r--   1 root     root         336 Jan 14 12:44 psinfo
-r--------   1 root     root        4608 Jan 14 12:44 rmap
lr-x------   1 root     root           0 Jan 14 12:44 root -> 
-r--------   1 root     root        1536 Jan 14 12:44 sigact
-r--------   1 root     root        1136 Jan 14 12:44 status
-r--r--r--   1 root     root         256 Jan 14 12:44 usage
-r--------   1 root     root           0 Jan 14 12:44 watch
-r--------   1 root     root        7296 Jan 14 12:44 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 :

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

Les Commandes relatives aux Processus

La commande ps

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

# ps
   PID TTY         TIME CMD
   822 pts/2       0:00 sh
   964 pts/2       0:00 ps

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

# ps -f
     UID   PID  PPID   C    STIME TTY         TIME CMD
    root   822   816   0 12:45:20 pts/2       0:00 -sh
    root   965   822   0 13:58:00 pts/2       0:00 ps -f

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 12:44:40 ?           0:17 sched
    root     4     0   0 12:44:42 ?           0:00 kmem_task
    root     1     0   0 12:44:42 ?           0:00 /sbin/init
    root     2     0   0 12:44:42 ?           0:00 pageout
    root     3     0   0 12:44:42 ?           0:03 fsflush
    root     5     0   0 12:44:42 ?           0:00 vmtasks
    root   390     1   0 12:44:55 ?           0:00 /lib/svc/method/iscsi-initiator
    root     9     1   0 12:44:43 ?           0:01 /lib/svc/bin/svc.startd
    root    11     1   0 12:44:43 ?           0:03 /lib/svc/bin/svc.configd
    root   113     1   0 12:44:46 ?           0:00 /usr/lib/sysevent/syseventd
    root   352     1   0 12:44:54 ?           0:00 /usr/sbin/cron
    root   420     9   0 12:44:55 ?           0:00 /usr/lib/saf/sac -t 300
    root   568     1   0 12:44:56 ?           0:00 /usr/lib/autofs/automountd
    root    67     1   0 12:44:45 ?           0:00 /sbin/dhcpagent
    root   279     1   0 12:44:53 ?           0:00 /usr/lib/picl/picld
    root   822   816   0 12:45:20 pts/2       0:00 -sh
  daemon   382     1   0 12:44:54 ?           0:00 /usr/lib/nfs/lockd
  daemon   372     1   0 12:44:54 ?           0:00 /usr/lib/nfs/nfs4cbd
  daemon   374     1   0 12:44:54 ?           0:00 /usr/lib/nfs/nfsmapid
    root   149     1   0 12:44:46 ?           0:00 /usr/lib/power/powerd
    root   751   719   0 12:44:58 ?           0:00 /usr/dt/bin/dtlogin -daemon
  daemon   373     1   0 12:44:54 ?           0:00 /usr/lib/nfs/statd
    root   434     9   0 12:44:55 console     0:00 /usr/lib/saf/ttymon -g -d /dev/console -l console -m ldterm,ttcompat -h -p sola
noaccess   813     1   0 12:45:02 ?           0:11 /usr/java/bin/java -server -Xmx128m -XX:+UseParallelGC -XX:ParallelGCThreads=4 
    root   587     1   0 12:44:56 ?           0:00 /usr/sbin/vold -f /etc/vold.conf
  daemon   144     1   0 12:44:46 ?           0:00 /usr/lib/crypto/kcfd
  daemon   367     1   0 12:44:54 ?           0:00 /usr/sbin/rpcbind
    root   142     1   0 12:44:46 ?           0:00 /usr/sbin/nscd
    root   473   469   0 12:44:55 ?           0:00 /usr/sadm/lib/smc/bin/smcboot
    root   424   420   0 12:44:55 ?           0:00 /usr/lib/saf/ttymon
    root   471   469   0 12:44:55 ?           0:00 /usr/sadm/lib/smc/bin/smcboot
    root   966   822   0 13:58:26 pts/2       0:00 ps -fe
    root   423     1   0 12:44:55 ?           0:00 /usr/lib/inet/inetd start
    root   469     1   0 12:44:55 ?           0:00 /usr/sadm/lib/smc/bin/smcboot
    root   442     1   0 12:44:55 ?           0:00 /usr/lib/utmpd
    root   569   568   0 12:44:56 ?           0:00 /usr/lib/autofs/automountd
    root   691     1   0 12:44:57 ?           0:00 /usr/lib/dmi/dmispd
    root   698     1   0 12:44:57 ?           0:00 /usr/lib/dmi/snmpXdmid -s solaris.i2tch.loc
    root   816   815   0 12:45:16 ?           0:00 /usr/lib/ssh/sshd
    root   726   719   0 12:44:58 ??          0:00 /usr/openwin/bin/fbconsole -n -d :0
    root   815   594   0 12:45:16 ?           0:00 /usr/lib/ssh/sshd
    root   594     1   0 12:44:56 ?           0:00 /usr/lib/ssh/sshd
    root   657     1   0 12:44:56 ?           0:00 /usr/lib/snmp/snmpdx -y -c /etc/snmp/conf
    root   611     1   0 12:44:56 ?           0:01 /usr/lib/fm/fmd/fmd
    root   609     1   0 12:44:56 ?           0:00 /usr/sbin/syslogd
    root   728   719   0 12:44:58 ?           0:04 /usr/X11/bin/Xorg :0 -depth 24 -nobanner -auth /var/dt/A:0-aZa4zb
    root   677     1   0 12:44:56 ?           0:00 /usr/sfw/sbin/snmpd
    root   771   751   0 12:45:01 ?           0:01 dtgreet -display :0
   smmsp   653     1   0 12:44:56 ?           0:00 /usr/lib/sendmail -Ac -q15m
    root   654     1   0 12:44:56 ?           0:00 /usr/lib/sendmail -bl -q15m
    root   669     1   0 12:44:56 ?           0:00 devfsadmd
    root   719     1   0 12:44:57 ?           0:00 /usr/dt/bin/dtlogin -daemon

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
# sleep 9999 &
[1]     969

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.

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] + 969        Running                 sleep 9999 &

Important - Le numéro de tâche est indiqué entre [crochets] tandis que le PID ne l'est pas.

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.

Lancez la commande sleep 1234 en avant plan puis ensuite suspendez ce processus à l'aide de ^Z :

# sleep 1234
^Z[2] + Stopped (SIGTSTP)        sleep 1234
# jobs -l
[2] + 972       Stopped (SIGTSTP)        sleep 1234
[1] - 969        Running                 sleep 9999 &

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

# bg %2
[2]     sleep 1234&
# jobs -l
[2] + 972        Running                 sleep 1234
[1] - 969        Running                 sleep 9999 &

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 –s stop :

# kill -s stop %2
# jobs -l
[2] + 972       Stopped (SIGSTOP)        sleep 1234
[1] - 969        Running                 sleep 9999 &

Important - Notez bien l'utilisation de la commande jobs -l pour se renseigner sur l'état du processus concerné.

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

# fg %2
sleep 1234
^C# 

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 :

# jobs -l
[1] + 969        Running                 sleep 9999 &
# wait %1
^C# 
# jobs -l
[1] + 969        Running                 sleep 9999 &

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.

Important - Il est à noter que seul root peut décrémenter la valeur de priorité avec la commande renice.

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 sh :

# echo $SHELL
/sbin/sh
# kill -l 
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 ksh :

# which ksh
/usr/bin/ksh
# /usr/bin/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 :

# exit
# echo $SHELL
/sbin/sh
# which bash
/usr/bin/bash
# /usr/bin/bash
bash-3.2# 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     38) SIGXRES     41) SIGRTMIN    42) SIGRTMIN+1
43) SIGRTMIN+2  44) SIGRTMIN+3  45) SIGRTMAX-3  46) SIGRTMAX-2
47) SIGRTMAX-1  48) SIGRTMAX  
bash-3.2# exit
exit

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 
9     /lib/svc/bin/svc.startd
  413   /usr/lib/saf/sac -t 300
    419   /usr/lib/saf/ttymon
  435   /usr/lib/saf/ttymon -g -d /dev/console -l console -m ldterm,ttcompat -h
11    /lib/svc/bin/svc.configd
67    /sbin/dhcpagent
113   /usr/lib/sysevent/syseventd
137   /usr/lib/power/powerd
144   /usr/lib/crypto/kcfd
269   /usr/lib/picl/picld
371   /usr/sbin/nscd
380   /lib/svc/method/iscsi-initiator
383   /usr/sbin/rpcbind
387   /usr/lib/nfs/statd
388   /usr/lib/nfs/nfsmapid
390   /usr/lib/nfs/nfs4cbd
407   /usr/lib/nfs/lockd
424   /usr/lib/inet/inetd start
429   /usr/sbin/cron
432   /usr/lib/utmpd
495   /usr/sadm/lib/smc/bin/smcboot
  497   /usr/sadm/lib/smc/bin/smcboot
  504   /usr/sadm/lib/smc/bin/smcboot
609   /usr/sbin/vold -f /etc/vold.conf
611   /usr/lib/autofs/automountd
  612   /usr/lib/autofs/automountd
629   devfsadmd
644   /usr/sbin/syslogd
680   /usr/lib/ssh/sshd
  875   /usr/lib/ssh/sshd
    876   /usr/lib/ssh/sshd
      882   -sh
        886   sleep 9999
        917   ptree
695   /usr/lib/fm/fmd/fmd
701   /usr/lib/snmp/snmpdx -y -c /etc/snmp/conf
707   /usr/lib/sendmail -Ac -q15m
708   /usr/lib/sendmail -bl -q15m
736   /usr/lib/dmi/dmispd
738   /usr/sfw/sbin/snmpd
739   /usr/lib/dmi/snmpXdmid -s solaris.i2tch.loc
767   /usr/dt/bin/dtlogin -daemon
  768   /usr/openwin/bin/fbconsole -n -d :0
  769   /usr/X11/bin/Xorg :0 -depth 24 -nobanner -auth /var/dt/A:0-Dca4Fb
  791   /usr/dt/bin/dtlogin -daemon
    811   dtgreet -display :0
856   /usr/java/bin/java -server -Xmx128m -XX:+UseParallelGC -XX:ParallelGCThre

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
      Dump content: kernel pages
       Dump device: /dev/dsk/c0t0d0s1 (swap)
Savecore directory: /var/crash
  Savecore enabled: yes
   Save compressed: on

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/,
  • crash dump est activée.

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

# dumpadm -n
      Dump content: kernel pages
       Dump device: /dev/dsk/c0t0d0s1 (swap)
Savecore directory: /var/crash
  Savecore enabled: no
   Save compressed: on

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

# dumpadm -y
      Dump content: kernel pages
       Dump device: /dev/dsk/c0t0d0s1 (swap)
Savecore directory: /var/crash
  Savecore enabled: yes
   Save compressed: on

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/c0t0d0s1 -m 10%
      Dump content: kernel pages
       Dump device: /dev/dsk/c0t0d0s1 (swap)
Savecore directory: /var/crash (minfree = 849594KB)
  Savecore enabled: yes
   Save compressed: on

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

# gcore $$
gcore: core.882 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.882
core 'core.882' of 882: -sh
 fef1cd85 waitid   (0, 3a5, 8047cd0, 83)
 fef0e644 waitpid  (3a5, 8047d98, 80) + 75
 0805e95d ???????? (8076da8)
 0805f240 postjob  (3a5, 1) + ce
 08059c95 execute  (80771e4, 0, 0) + 71d
 0806072f ???????? (0)
 080605ab main     (1, 8047e5c, 8047e64) + 4af
 0805528a ???????? (1, 8047f08, 0, 8047f0c, 8047f16, 8047f23)

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

Important - Il est à noter ici que le service cron présume que la machine est allumée en permanence.

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
xterm-256color: Unknown terminal type
I don't know what kind of terminal you are on - all I have is 'xterm-256color'.
[Using open mode]
".profile" [New file] 
EDITOR=/usr/bin/vi
export EDITOR
:x
".profile" [New file] 3 lines, 34 characters 
# cat .profile
EDITOR=/usr/bin/vi
export EDITOR
TERM=vt100
export TERM

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
# echo $TERM
vt100

Nous pouvons maintenant éditer le crontab de root :

# crontab -e
#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.oaqNb" 14 lines, 482 characters

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

* * * * * /bin/pwd > pwd.txt

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 :

# cat /var/spool/cron/crontabs/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___
* * * * * /bin/pwd > pwd.txt
# 

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

Important - Si le fichier at.allow existe, seuls les utilisateurs dans ce fichier pourront exécuter at.

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
at> pwd > /tmp/test.atd
at> <EOT>
commands will be executed using /sbin/sh
job 1579153920.a at Thu Jan 16 06:52:00 2020

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

# at -l
user = root     1579153920.a    Thu Jan 16 06:52:00 2020

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

# cat /tmp/test.atd
/

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

at> pwd > /tmp/test13.atd
at> <EOT>
commands will be executed using /sbin/sh
job 1609416000.a at Thu Dec 31 13:00:00 2020
# at 14:00 Dec 31
at> vmstat > /tmp/test14.atd
at> <EOT>
commands will be executed using /sbin/sh
job 1609419600.a at Thu Dec 31 14:00:00 2020

Il existent maintenant deux tâches :

# at -l
user = root     1609416000.a    Thu Dec 31 13:00:00 2020
user = root     1609419600.a    Thu Dec 31 14:00:00 2020

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

# ls /var/spool/cron/atjobs
1609416000.a  1609419600.a

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

# cat /var/spool/cron/atjobs/1609419600.a
: at job
: jobname: stdin
: notify by mail: no
: project: 1
export EDITOR; EDITOR='/usr/bin/vi'
export HOME; HOME='/'
export LANG; LANG='C'
export LOGNAME; LOGNAME='root'
export MAIL; MAIL='/var/mail//root'
export PATH; PATH='/usr/sbin:/usr/bin'
export SHELL; SHELL='/sbin/sh'
export SSH_CLIENT; SSH_CLIENT='10.0.2.2 55666 22'
export SSH_CONNECTION; SSH_CONNECTION='10.0.2.2 55666 10.0.2.15 22'
export SSH_TTY; SSH_TTY='/dev/pts/2'
export TERM; TERM='vt100'
export TZ; TZ='Europe/Paris'
export USER; USER='root'
$SHELL << '...the rest of this file is shell input'
#ident  "@(#).proto     1.6     00/05/01 SMI"   /* SVr4.0 1.2   */
cd /
umask 22
ulimit unlimited
vmstat > /tmp/test14.atd

Pour supprimer cette tâche il convient d'utiliser la commande at avec l'option -r :

# at -l
user = root     1609416000.a    Thu Dec 31 13:00:00 2020
user = root     1609419600.a    Thu Dec 31 14:00:00 2020
# at -r 1609416000.a
# at -l
user = root     1609419600.a    Thu Dec 31 14:00:00 2020

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]

<html> <center> Copyright © 2020 Hugh Norris.<br><br> </center> </html>

Menu