2010-05-31 35 views

Respuesta

13

Al comienzo de su script de shell, escriba el PID en un archivo (por ejemplo, en/var/run). Luego, puede buscar ese PID para saber si el proceso está hecho o no. Puede obtener el PID de su script de shell usando la variable incorporada $$.

Para grabar el PID, se puso en la parte superior de su script:

echo $$ > /var/run/myscript.pid 

Entonces, para comprobar si todavía está en ejecución:

ps -p `cat /var/run/myscript.pid` 

Es posible que no será capaz de escribir en /var/run como un usuario normal. Si no, solo use /tmp

+0

Gracias. ¿Puedo usar algo que no sea/var/run y/tmp like/home? – learner135

+0

Sí, lo que funcione mejor para usted. –

+9

Nota de precaución: Los PID a veces se vuelven a usar (más a menudo en sistemas operativos sin fuerte aleatoriedad o en sistemas con muchos procesos de corta duración). El paranoico podría querer verificar que el proceso tenga el padre correcto ($$), o hacer que el script secundario elimine el archivo myscript.pid al salir (algo así como '' trap '' rm /var/run/myscript.pid EXIT '') O ambos. – pra

11

Sujeto a la implementación nohup, pero en la mayoría de los casos funcionará. Después de ejecutar

nohup script.sh & 

tienda de la PID en una variable. ps es el PID del último proceso en segundo plano.

HISPID=$! 

entonces usted puede comprobar si está allí con ps o matar:

ps -p $HISPID 
kill -0 $HISPID 

A diferencia de la otra solución publicada, esto no requiere la modificación del script.sh

+0

Gracias, pero parece que $! No es compatible con mi entorno de shell. Estoy usando ksh. – learner135

2

$! es definitivamente parte de ksh y ksh93.

echo $SHELL 

le mostrará qué shell está ejecutando.

Ejemplo de uso razonable de &

#!/bin/ksh 
nohup ./myscript.sh argument1 2>&1> mylogfile & 
# do some other task 
cnt=0 
while [ $cnt -le 100 ] 
do 
    # work on another task here 
    cnt=$(($cnt + 1)) 
done 
wait 

La declaración de espera se detiene por cualquier proceso hijo todavía en funcionamiento. Normalmente no se envía un proceso al fondo, se espera que se ejecute para siempre, y luego se olvida por completo.

Si desea un proceso completamente independiente que se ejecute para siempre, considere un daemon. Algunas personas escriben daemons en shell, no es la mejor práctica, pero ya está hecho. Normalmente los demonios de UNIX están escritos en C.

Capítulo 13 de la Programación Avanzada de Stevens en el Ambiente UNI '2ed se trata de daemons.

2

Seguí la sugerencia de scompt.com modificar mi script para almacenar el pid

Entonces me di cuenta de la pid se escribe en la salida, así que no hay necesidad de almacenarlo:

$ nohup ./sync-all.production.sh > sync-all.production.log & 

[1] 3428 
0

lo que ha funcionado es

sudo ps -e | grep [script name or fragment of name] 

por ejemplo, para un script llamado "mf-sync.js"

sudo ps -e | grep mf-sync 

muestra el nombre del script y el pid; entonces puedo usar, por ejemplo, si pid era 1234

sudo kill 1234 

próxima tengo que añadir un tiempo de espera para matar automáticamente una vez transcurrido el tiempo suficiente para que se ejecute con normalidad, pero eso es otra cuestión

su parte puedo cuidar a este proceso para ejecutar la sincronización de mi cliente, hasta que tenga tiempo para probar el tiempo de espera en un guión

+0

¿Cómo localizas tu contraseña de sudo, si no recuerdas haber creado alguna? –

-1

Código:

ps r 

para informar de todos corriendo procesos.

+0

¿Podrías elaborar más tu respuesta? añadiendo un poco más de descripción sobre la solución que proporciona? – abarisone

Cuestiones relacionadas