我如何观察shell脚本中的进程是否已经死亡



我正在运行一个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

1。kill-0是在shell中终止子进程的一种方法吗

在Linux操作系统上,kill -0只是一种尝试终止进程并查看会发生什么的方法,"0"不是POSIX信号,它什么都不做。如果进程正在运行,则kill将返回0,如果不是,则返回1。CCD_ 5可以做同样的工作。要终止进程,通常使用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

CAVEATS我使用/bin/bash作为解释器,因为一些Bourne Shell(sh(无法支持使用数组(即spin[n](。

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

#!/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

相关内容

  • 没有找到相关文章

最新更新