如何正确轮询后台脚本的存在

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 没有帮助。所以我不想使用任何魔法延迟,因为它可能不可靠。

Mik*_*kel 4

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)