Ceci est une ancienne révision du document !
Table des matières
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>