我希望在后台进程中 ping 我的路由器。我还想将 ping 进程作为服务来控制:启动、状态、停止。因此,我创建了锁定文件并将 PID 存储在其中。但实际上 PID 正在发生变化,我无法终止进程。我将 PID 存储在变量 $$ 中,但它会发生变化,我不知道原因,可能是因为我运行了管道,也可能是我在后台运行进程?您能否告诉我,如何在 sh 脚本中获取 PID,我在后台运行管道的位置?
我的 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
实际上,该行echo $$ > /tmp/ping.lock ##here i store script pid
并不存储实际的 PID,但存储的 PID 消失了。并且此调用不会终止我的脚本:
$ ./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
可以看到,调用后./ping.sh stop
我的脚本进程仍然存在,其 PID 为 6089,而锁文件中存储的 PID 为 6087。如何获取锁文件中存储的 PID 6089?何时以及如何存储它?
您在寻找吗
$!
?捕获前一个使用命令的 PID
&
。$0
......正在执行的脚本的名称。$1-9
......前九个命令行参数。$#
......命令行参数的数量。$*
......所有命令行参数作为单个字符串。$@
......所有命令行参数作为数组。$?
......最后执行的命令的退出状态。$$
......当前 shell 的进程 ID。$!
......最后一个后台命令的进程 ID。