Solución:
Usar pkill
comando como
pkill -f test.py
(o) una forma más infalible usando pgrep
para buscar el ID de proceso real
kill $(pgrep -f 'python test.py')
O si se identifica más de una instancia del programa en ejecución y todas deben eliminarse, use killall (1) en Linux y BSD
killall test.py
Puedes usar el !
para obtener el PID del último comando.
Sugeriría algo similar a lo siguiente, que también verifique si el proceso que desea ejecutar ya se está ejecutando:
#!/bin/bash
if [[ ! -e /tmp/test.py.pid ]]; then # Check if the file already exists
python test.py & #+and if so do not run another process.
echo $! > /tmp/test.py.pid
else
echo -n "ERROR: The process is already running with pid "
cat /tmp/test.py.pid
echo
fi
Entonces, cuando quieras matarlo:
#!/bin/bash
if [[ -e /tmp/test.py.pid ]]; then # If the file do not exists, then the
kill `cat /tmp/test.py.pid` #+the process is not running. Useless
rm /tmp/test.py.pid #+trying to kill it.
else
echo "test.py is not running"
fi
Por supuesto, si el asesinato debe tener lugar algún tiempo después de que se haya lanzado el comando, puede poner todo en el mismo script:
#!/bin/bash
python test.py & # This does not check if the command
echo $! > /tmp/test.py.pid #+has already been executed. But,
#+would have problems if more than 1
sleep(<number_of_seconds_to_wait>) #+have been started since the pid file would.
#+be overwritten.
if [[ -e /tmp/test.py.pid ]]; then
kill `cat /tmp/test.py.pid`
else
echo "test.py is not running"
fi
Si desea poder ejecutar más comandos con el mismo nombre simultáneamente y poder eliminarlos de forma selectiva, se necesita una pequeña edición del script. ¡Dime, intentaré ayudarte!
Con algo como esto, estás seguro de que estás matando lo que quieres matar. Comandos como pkill
o agarrando el ps aux
puede ser arriesgado.