Procesos UNIX


El sistema operativo UNIX mantiene una tabla de todos sus procesos o programas que corren en la máquina, con el nombre del usuario que lo creo, el tiempo de ejecución, el estado del proceso, etc. El comando que permite ver esto es "ps".

Con la opción "-u user" visualizo los procesos de dicho usuario, ejemplo:

moises@tonatiuh% ps -u moises
   PID TTY      TIME COMD
  7603 pts/1    0:00   csh
  7606 console  0:02   cmdtool
  8064 pts/2    8:13   netscape
  7550 console  0:01   csh
  8938 pts/     0:00   ed
  7590 console  0:00   olwmslav
. . .

Con la opción "-ef" me despliega todos los procesos con más información:
moises@tonatiuh%  ps -ef
 UID   PID  PPID  C    STIME   TTY   TIME COMD
root    0     0   76   Dec 18   ?    0:01 sched
root    1     0   80   Dec 18   ?    1:57 /etc/init -
root    2     0   80   Dec 18   ?    0:42 pageout
root    3     0   80   Dec 18   ?  202:51 fsflush
moises 7603 7600  42  12:55:40 pts/1 0:00 /bin/csh
. . .
root   1903 24972 80   Jan 23   ?    0:01 lpNet
ydm    8604 8602  80  14:30:35 pts/6 0:01 -csh

Y con la opción "-el" se tiene un formato más largo:
moises@tonatiuh% ps -el
 F S  UID  PID  PPID  C  PRI NI    ADDR    SZ   WCHAN    TTY    TIME COMD
19 T   0    0    0    76  0  SY  f01878c8   0             ?     0:01 sched
 8 S   0    1    0    80  41 20  fc0be998  204 fc0beb68   ?     1:57 init
 8 S   0   271   1    54  41 20  fc0bd018  306 fc526d2e   ?     0:01 sac
.  .  .
 8 S 15013 7636  1    80  51 20  fc4ec660 1324 fc5b17fe console 0:03 mailtool
 8 S   0   1903 24972 80  41 20  fc832340 1134 fc5b1466    ?    0:01 lpNet
 8 S 15042 8604 8602  80  41 20  fc831ce0  473 fc4d3cee  pts/6  0:01 csh

Cada columna describe el estado del proceso y se puede tener toda la información con el manual en línea (man ps). Aquí están parte de la descripción:
(Nota: lo puesto en paréntesis indica con que opción del comando se activa)
S       (l)    Estado del proceso:
               O     Corriendo sobre un procesador
               S     En espera de un evento sea completado.
               I     Ocioso.
               Z     Zombie
               T     Parado por una señal del padre.
UID     (f,l)  El número ID del usuario.
PID     (all)  Número del proceso.
PPID    (f,l)  Número del proceso padre.
PRI     (l)    Prioridad del proceso.
ADDR    (l)    Dirección de memoria del proceso.
TIME    (all)  Tiempo acumulativo de ejecución.
COMMAND (all)  Nombre del comando. (Nombre completo con -f)
Unix permite ejecutar comandos que no requieran interactuar con el usuario en el background, es decir que si tengo una ventana y ejecuto un comando de esta manera, entonces esa ventana esta lista nuevamente para recibir otro comando. El símbolo para indicarle al sistema esto es "&". Ejemplo, si ejecuto el editor (mal ejemplo!) en background lo haría así: "ed &".

Para ver los programas que están corriendo en background se usa el comando "jobs", ejemplo:

moises@tonatiuh% jobs
[1]  + Stopped (tty input)  ed

O si conocemos el número del trabajo podemos ver su estado con el comando "notify #", ejemplo:
moises@tonatiuh% notify 1
[1]  + Stopped (tty input)  ed

Para sacarlo del background y tenerlo activo, se usa el comando "fg" indicando el proceso:
moises@tonatiuh% fg 1
ed
q
moises@tonatiuh% 
aquí el sistema indica que esta activo el editor y con "q", salimos de edición.
Al ejecutar nuevamente el comando, no se tiene ningún proceso en background
moises@tonatiuh% jobs
moises@tonatiuh%

Volvamos a ejecutar el editor en background
moises@tonatiuh% ed &
[1] 9536

Veamos como esta indicado el proceso "ed" el la tabla del sistema
moises@tonatiuh% ps -lu moises | grep ed
F S  UID  PID  PPID  C PRI NI    ADDR    SZ  WCHAN TTY   TIME COMD
 . . .
8 T 15013 9536 9531  9  56 20  fca8acd8  175       pts/8 0:00 ed
. . .

Si en estos momentos queremos salirnos del sistema o matar la ventana con "exit", tendríamos el siguiente mensaje:
moises@tonatiuh% exit
There are stopped jobs

Para matar el proceso se usa el comando "kill -9 PID", donde "PID" es el número del proceso, ejemplo:
moises@tonatiuh% kill -9 9536
moises@tonatiuh% 
[1]    Killed    ed
Y entonces se puede dar nuevamente el comando "exit".


Para incrementar o decrementar la prioridad de un proceso se usa el comando "nice" y la forma de uso en csh es:

nice [ +n | -n] [comando]

Los rangos van del -20 al 20 y por default es 4. Si el comando es omitido, se incrementa la prioridad para el shell.


Al salirse de la cuenta en Unix, el sistema mata todos los procesos del usuario y si existe alguno que requiera más tiempo de ejecución se puede usar el comando "nohup" para que el sistema lo deje correr y así dejar la terminal disponible para otro usuario. Mode de uso:

nohup comando &

Por último, para ejecutar procesos en lapsos de tiempo determinados se usa el comando "crontab", donde la opción "-e" permite editar la tabla de eventos, la opción "-l" lista la tabla y la opción "-r" borra la tabla.
Ejemplo:
moises@tonatiuh% crontab -l
0 13,18 * * * /chil/spool/clima/nubes
Donde cada columna indica lo siguiente:

 minuto  hora  día del mes   mes del año   día de la semana
____________________________________________________________
  0-59   0-23     1-31	       1-12	   0-6 (0=Domingo)