我有一个 init 脚本/etc/init.d/myservice用于初始化这样的服务:
...
start() {
...
daemon /usr/sbin/myservice
...
}
stop() {
...
pgrep myservice
pidof myservice
ps -ef | grep myservice
...
}
Run Code Online (Sandbox Code Playgroud)
当我尝试停止服务时,这是输出:
10000 10001
10000
root 10000 1 0 09:52 ? 00:00:02 /usr/sbin/myservice
root 9791 9788 0 10:06 pts/1 00:00:00 /bin/sh /sbin/service myservice stop
root 10001 9791 1 10:06 pts/1 00:00:00 /bin/sh /etc/init.d/myservice stop
root 9805 9796 0 10:06 pts/1 00:00:00 grep myservice
Run Code Online (Sandbox Code Playgroud)
这是预期的吗?为什么pidof只返回我想要停止的服务的正确 PID 并pgrep返回服务 PID 和 init 脚本的 …
我对以下类型的脚本有问题:
#!/bin/sh
long_running_script.sh &
while [ `pidof long_running_script.sh` ]
do
echo "."
sleep 1
done
Run Code Online (Sandbox Code Playgroud)
sript 将启动一个新脚本到后台,它应该打印点,直到后台脚本退出。它在 CPU 负载不高时工作。
但是,当 CPU 负载较高时,它不会工作:long_running_script.sh 将启动,但“父”脚本将在 long_running_script.sh 退出之前退出 while 循环。
似乎pidof是在 long_running_script.sh 真正启动(执行)之前执行的。
解决这个问题的最佳方法是什么?
在 while 语句之前 1 秒 sleep 没有帮助。所以我不想使用任何魔法延迟,因为它可能不可靠。
在 的输出中ps aux,我可以很好地看到该过程:
# ps aux | grep diff
root 7787 28.7 0.0 9368 4516 pts/3 D+ 13:56 20:33 diff -qr mnt/mnt/md/ mnt/mnt2/
root 13130 0.0 0.0 6144 876 pts/4 S+ 15:07 0:00 grep diff
Run Code Online (Sandbox Code Playgroud)
但pidof声称找不到任何东西:
# pidof diff
# echo $?
1
Run Code Online (Sandbox Code Playgroud)
查看手册页,没有关于丢失进程时该怎么做的信息,pidof 有。/proc/7787/exe是一个符号链接/usr/bin/diff,/usr/bin/diff它本身是一个常规文件和一个 ELF。根据手册页,这应该匹配。
我结合top并pidof命令:
top -p $(pidof <process_name>)
Run Code Online (Sandbox Code Playgroud)
如果pidof <process_name>返回一个 idtop命令有效。但是如果pidof <process_name>不止一个 idstop命令不起作用。
pidof 返回 ID 之间有一个空格,例如: 123 124 125
如果我可以用逗号之类的123, 124, 125 top命令获取这些 id就可以了。如何更改 的输出格式pidof?
我知道awk用于格式化文本数据。但是我找不到如何awk用于 shell 命令的结果。