Můžete použít !
získat PID posledního příkazu.
Navrhoval bych něco podobného následujícímu, které by také zkontrolovalo, zda proces, který chcete spustit, již běží:
#!/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
Potom, když ho chcete zabít:
#!/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
Samozřejmě, pokud k zabití musí dojít nějakou dobu po spuštění příkazu, můžete vše vložit do stejného skriptu:
#!/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
Pokud chcete mít možnost spouštět více příkazů se stejným názvem současně a být schopni je selektivně zabíjet, je potřeba malá úprava skriptu. Řekněte mi, pokusím se vám pomoci!
S něčím takovým máte jistotu, že zabíjíte to, co zabít chcete. Příkazy jako pkill
nebo grepping ps aux
může být riskantní.
Použijte pkill
příkaz jako
pkill -f test.py
(nebo) odolnějším způsobem pomocí pgrep
pro vyhledání skutečného ID procesu
kill $(pgrep -f 'python test.py')
Nebo pokud je identifikováno více než jedna instance běžícího programu a všechny je třeba zabít, použijte killall(1) na Linuxu a BSD
killall test.py