【问题标题】:how do I watch for a process to have died in shell script?我如何观察一个进程在 shell 脚本中死亡?
【发布时间】:2022-10-25 15:41:29
【问题描述】:

我正在运行一个可以查看进度条的 shell 测试程序,但是当我运行它时,我不断收到一元错误。 kill -0 是一种在 shell 中杀死子进程的方法吗? 还是有另一种方法来测试我的进程是否已经死亡? 这是我的代码来运行进度条,直到我的命令结束:

#!/bin/sh
# test my progress bar

spin[0]="-"
spin[1]="\\"
spin[2]="|"
spin[3]="/"

sleep  10 2>/dev/null &    # run as background process
pid=$!                     # grab process id

echo -n "[sleeping] ${spin[0]}"

while [ kill -0 $pid ]     # wait for process to end
do
  for i in "${spin[@]}"
  do
    echo -ne "\b$i"
    sleep 0.1
  done
done
enter code here

【问题讨论】:

  • 我发现如果你在后台运行微调器并在前台运行进程,这种事情会更干净。当进程终止时,您将杀死微调器。

标签: shell sh unary-operator


【解决方案1】:

1. kill -0 是一种在 shell 中杀死子进程的方法吗?

在 Linux 操作系统上,kill -0 只是一种尝试杀死进程并查看会发生什么的方法,'0' 不是 POSIX 信号,它什么都不做。 如果进程正在运行,则kill 将返回0,否则将返回1ps $pid >/dev/null 2>&1 可以做同样的工作。 要杀死一个进程,通常使用SIGQUIT/3(退出程序)或SIGKILL/9(终止程序);该进程可以捕获信号并干净退出,或者它可以忽略该信号,因此操作系统必须“快速而肮脏”地终止它。

2.测试和'['

  • 方括号 '[' 是一个实用程序 ( /bin/[ ),预计您提供的内容不正确。
  • while 的语法是while list; do list; done,其中list 将返回一个退出代码,因此您不必使用其他代码。

3. 如何在 shell 脚本中观察一个进程已经死亡?

就像你做的那样,下面的代码将完成这项工作:

#!/bin/bash

spin[0]="-"
spin[1]="\"
spin[2]="|"
spin[3]="/"

sleep  10 2>/dev/null &    # run as background process
pid=$!                     # grab process id

echo -n "[sleeping] ${spin[0]}"

#while ps -p $pid >/dev/null 2>&1       # using ps
while kill -0 $pid >/dev/null 2>&1      # using kill
do
  for i in "${spin[@]}"
  do
    echo -ne "$i"
    sleep 0.5
  done
done

注意事项我使用/bin/bash 作为解释器,因为某些Bourne Shell (sh) 不支持使用数组(即spin[n])。

【讨论】:

    【解决方案2】:

    在后台运行微调器并在进程(在前台运行)终止时将其终止可能更干净。或者,您可以在后台进程终止后打开另一个文件描述符并在其中写入一些内容,并让主进程块处于读取状态。例如:

    #!/bin/bash
    # test my progress bar
    spin[0]='-'
    spin[1]=''
    spin[2]='|'
    spin[3]='/'
    
    { { { sleep 10 2>/dev/null; echo >&5; } &    # run as background process
    } 5>&1 1>&3 | { # wait for process to end
            while ! read -t 1; do
                    printf "
    [sleeping] ${spin[ $(( i = ++i % 4 )) ]}"
            done
    }
    } 3>&1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 2018-02-22
      • 2012-09-30
      • 2018-05-15
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多