Puoi usare il !
per ottenere il PID dell'ultimo comando.
Suggerirei qualcosa di simile al seguente, che controlla anche se il processo che vuoi eseguire è già in esecuzione:
#!/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
Quindi, quando vuoi ucciderlo:
#!/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
Ovviamente se l'uccisione deve avvenire qualche tempo dopo che il comando è stato lanciato, puoi mettere tutto nello stesso 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
Se vuoi essere in grado di eseguire più comandi con lo stesso nome contemporaneamente ed essere in grado di ucciderli in modo selettivo, è necessaria una piccola modifica dello script. Dimmi, cercherò di aiutarti!
Con qualcosa del genere sei sicuro di uccidere ciò che vuoi uccidere. Comandi come pkill
o afferrare il ps aux
può essere rischioso.
Usa pkill
comando come
pkill -f test.py
(o) un modo più infallibile usando pgrep
per cercare l'ID processo effettivo
kill $(pgrep -f 'python test.py')
Oppure, se viene identificata più di un'istanza del programma in esecuzione e tutte devono essere terminate, utilizzare killall(1) su Linux e BSD
killall test.py