SKi*_*SKi 5 process shell-script pidof
我对以下类型的脚本有问题:
#!/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 没有帮助。所以我不想使用任何魔法延迟,因为它可能不可靠。
pidof不会找到脚本,因为它只查看进程名称的第一部分 ( argv[0])。
您可以使用pidof -m,但这会找到任何 long_running_script.sh,而不仅仅是此脚本启动的那个。
更好的方法是使用$!变量,它保存最近后台作业的 PID。
#!/bin/bash
long_running_script.sh &
pid=$!
while ps -p $pid >/dev/null
do
echo "."
sleep 1
done
Run Code Online (Sandbox Code Playgroud)