ver sleeping qué procesos proceso identificador ejemplos crear como comando shell background-process pid

shell - sleeping - ver procesos comando linux



¿Cómo obtener PID del proceso de fondo? (7)

Debe guardar el PID del proceso en segundo plano en el momento de iniciarlo:

foo & FOO_PID=$! # do other stuff kill $FOO_PID

No puede utilizar el control de trabajos, ya que es una función interactiva y está vinculada a un terminal de control. Un script no necesariamente tendrá un terminal conectado, por lo que el control de trabajos no estará necesariamente disponible.

Comienzo un proceso en segundo plano desde mi script de shell, y me gustaría finalizar este proceso cuando mi script finalice

¿Cómo obtener el PID de este proceso desde mi shell script? Por lo que puedo ver variable $! contiene el PID del script actual, no el proceso en segundo plano.


Puede usar el comando jobs -l para llegar a un trabajo particularL

^Z [1]+ Stopped guard my_mac:workspace r$ jobs -l [1]+ 46841 Suspended: 18 guard

En este caso, 46841 es el PID.

De help jobs :

-l Reportar el ID del grupo de procesos y el directorio de trabajo de los trabajos.

jobs -p es otra opción que muestra solo los PID.


También puedes usar pstree:

pstree -p user

Por lo general, esto proporciona una representación de texto de todos los procesos para el "usuario" y la opción -p proporciona el id de proceso. No depende, por lo que yo entiendo, de que los procesos sean propiedad del shell actual. También muestra horquillas.


Una forma aún más sencilla de eliminar todos los procesos secundarios de un script bash:

pkill -P $$

El indicador -P funciona de la misma manera con pkill y pgrep : obtiene procesos secundarios, solo con pkill los procesos secundarios se eliminan y con pgrep los PID secundarios se imprimen en la salida estándar.


esto es lo que he hecho. Échale un vistazo, espero que pueda ayudar.

#!/bin/bash # # So something to show. echo "UNO" > UNO.txt echo "DOS" > DOS.txt # # Initialize Pid List dPidLst="" # # Generate background processes tail -f UNO.txt& dPidLst="$dPidLst $!" tail -f DOS.txt& dPidLst="$dPidLst $!" # # Report process IDs echo PID=$$ echo dPidLst=$dPidLst # # Show process on current shell ps -f # # Start killing background processes from list for dPid in $dPidLst do echo killing $dPid. Process is still there. ps | grep $dPid kill $dPid ps | grep $dPid echo Just ran "''"ps"''" command, $dPid must not show again. done

Luego simplemente ejecútelo como: ./bgkill.sh con los permisos adecuados, por supuesto

root@umsstd22 [P]:~# ./bgkill.sh PID=23757 dPidLst= 23758 23759 UNO DOS UID PID PPID C STIME TTY TIME CMD root 3937 3935 0 11:07 pts/5 00:00:00 -bash root 23757 3937 0 11:55 pts/5 00:00:00 /bin/bash ./bgkill.sh root 23758 23757 0 11:55 pts/5 00:00:00 tail -f UNO.txt root 23759 23757 0 11:55 pts/5 00:00:00 tail -f DOS.txt root 23760 23757 0 11:55 pts/5 00:00:00 ps -f killing 23758. Process is still there. 23758 pts/5 00:00:00 tail ./bgkill.sh: line 24: 23758 Terminated tail -f UNO.txt Just ran ''ps'' command, 23758 must not show again. killing 23759. Process is still there. 23759 pts/5 00:00:00 tail ./bgkill.sh: line 24: 23759 Terminated tail -f DOS.txt Just ran ''ps'' command, 23759 must not show again. root@umsstd22 [P]:~# ps -f UID PID PPID C STIME TTY TIME CMD root 3937 3935 0 11:07 pts/5 00:00:00 -bash root 24200 3937 0 11:56 pts/5 00:00:00 ps -f


pgrep puede obtener todos los PID secundarios de un proceso principal. Como se mencionó anteriormente, $$ es el PID de los scripts actuales. Entonces, si quieres un script que se limpie después de sí mismo, esto debería hacer el truco:

trap ''kill $( pgrep -P $$ | tr "/n" " " )'' SIGINT SIGTERM EXIT


  • $$ es el pid del script actual
  • $! Es el pid del último proceso de fondo.

Aquí hay una transcripción de muestra de una sesión de bash ( %1 refiere al número ordinal del proceso en segundo plano visto desde los jobs ):

$ echo $$ 3748 $ sleep 100 & [1] 192 $ echo $! 192 $ kill %1 [1]+ Terminated sleep 100