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