Sie können den !
verwenden um die PID des letzten Befehls zu erhalten.
Ich würde etwas Ähnliches wie das Folgende vorschlagen, das auch überprüft, ob der Prozess, den Sie ausführen möchten, bereits ausgeführt wird:
#!/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
Dann, wenn Sie es töten wollen:
#!/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
Wenn das Töten einige Zeit nach dem Start des Befehls erfolgen muss, können Sie natürlich alles in dasselbe Skript packen:
#!/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
Wenn Sie mehrere Befehle mit demselben Namen gleichzeitig ausführen und selektiv beenden möchten, ist eine kleine Bearbeitung des Skripts erforderlich. Sag es mir, ich werde versuchen, dir zu helfen!
Mit so etwas sind Sie sicher, dass Sie töten, was Sie töten wollen. Befehle wie pkill
oder grapschen Sie die ps aux
kann riskant sein.
Verwenden Sie pkill
Befehl als
pkill -f test.py
(oder) eine narrensicherere Methode mit pgrep
um nach der tatsächlichen Prozess-ID zu suchen
kill $(pgrep -f 'python test.py')
Oder wenn mehr als eine Instanz des laufenden Programms identifiziert wird und alle beendet werden müssen, verwenden Sie killall(1) unter Linux und BSD
killall test.py