如何在shell脚本中监视进程是否已死亡?

4si2a6ki  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(203)

我正在运行一个shell测试程序,我可以查看进度条,但是当我运行它的时候,我总是得到一元错误。kill-0是一种在shell中杀死子进程的方法吗?或者有没有其他方法来测试我的进程是否已经死亡?下面是我运行进度条的代码,直到我的命令结束:
第一个

uqxowvwt

uqxowvwt1#

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 "\b$i"
    sleep 0.5
  done
done

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

qxsslcnc

qxsslcnc2#

在后台运行spinner,并在进程(在前台运行)终止时杀死它可能会更干净。或者,你可以打开另一个文件描述符,并在后台进程终止后向其中写入一些内容,然后让主进程阻塞读操作。例如:

#!/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 "\r[sleeping] ${spin[ $(( i = ++i % 4 )) ]}"
        done
}
} 3>&1

相关问题