Desejo fazer ping em meu roteador em processo em segundo plano. Também quero controlar o processo de ping como um serviço: iniciar, status, parar. Então, eu crio um arquivo de bloqueio e armazeno o PID nele. Mas na verdade o PID está mudando e não posso encerrar meu processo. Eu armazeno o PID com a variável $$, mas está mudando, não sei por que, pode ser porque executo o pipe ou posso estar executando o processo em segundo plano? Você poderia me aconselhar como obter o PID no script sh, onde executo o pipe em segundo plano?
Código do meu script sh ping.sh:$ cat ping.sh
#!/bin/sh
option=$1
if [ "$option" = "start" ]; then
if [ -f /tmp/ping.lock ]; then
echo There is another ping process. Exit
exit 1
else
touch /tmp/ping.lock
(ping 192.168.1.1 | ts | tee -a >> ~/1) &
echo $$ > /tmp/ping.lock ##here i store script pid
fi
elif [ "$option" = "status" ]; then
if [ -f /tmp/ping.lock ]; then
echo ping is running. PID:
cat /tmp/ping.lock
else
echo ping is not running
fi
elif [ "$option" = "stop" ]; then
if [ -f /tmp/ping.lock ]; then
echo killing ping process
kill $(cat /tmp/ping.lock)
echo removing lock file
rm /tmp/ping.lock
echo ping stopped.
else
echo ping is not running.
fi
else
echo Usage: $0 [start, status, stop]
fi
Na verdade, a linha echo $$ > /tmp/ping.lock ##here i store script pid
não armazena o PID real, mas o pid armazenado desaparece. E esta chamada não mata meu script:
$ ./ping.sh
Usage: ./ping.sh [start, status, stop]
$ ./ping.sh start
There is another ping process. Exit
$ rm /tmp/ping.lock
$
$ ./ping.sh start
$ ps -ef | grep ping
y 5271 2221 1 19:36 ? 00:00:10 /usr/lib/chromium/chromium --show-component-extension-options --enable-gpu-rasterization --no-default-browser-check --disable-pings --media-router=0 --enable-remote-extensions --load-extension
y 5993 4075 0 19:44 pts/2 00:00:00 vim ping.sh
y 6089 1 0 19:45 pts/5 00:00:00 /bin/sh ./ping.sh start
y 6090 6089 0 19:45 pts/5 00:00:00 ping 192.168.1.1
y 6095 5241 0 19:45 pts/5 00:00:00 grep ping
$
$ cat /tmp/ping.lock
6087
$
$ ./ping.sh stop
killing ping process
./ping.sh: 27: kill: No such process
removing lock file
ping stopped.
$
$ ps -ef | grep ping
y 5271 2221 1 19:36 ? 00:00:10 /usr/lib/chromium/chromium --show-component-extension-options --enable-gpu-rasterization --no-default-browser-check --disable-pings --media-router=0 --enable-remote-extensions --load-extension
y 5993 4075 0 19:44 pts/2 00:00:00 vim ping.sh
y 6089 1 0 19:45 pts/5 00:00:00 /bin/sh ./ping.sh start
y 6090 6089 0 19:45 pts/5 00:00:00 ping 192.168.1.1
y 6148 5241 0 19:46 pts/5 00:00:00 grep ping
Como você pode ver, após a chamada ./ping.sh stop
ainda há processo do meu script e seu PID é 6089, enquanto no arquivo de bloqueio está armazenado o PID 6087. Como obter o PID 6089 armazenado no arquivo de bloqueio? Quando e como armazená-lo?
Você está procurando
$!
?Captura o PID do comando anterior usado
&
.$0
......O nome do script que está sendo executado.$1-9
..Os primeiros nove argumentos da linha de comando.$#
......O número de argumentos de linha de comando.$*
......Todos os argumentos da linha de comando como uma única string.$@
......Todos os argumentos da linha de comando como um array.$?
......O status de saída do último comando executado.$$
......O ID do processo do shell atual.$!
.....O ID do processo do último comando em segundo plano.