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
# 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
2条答案
按热度按时间uqxowvwt1#
1. kill -0是否是在shell中终止子进程的一种方法?
在Linux操作系统上,
kill -0
只是一种尝试杀死进程并查看结果的方法,'0'不是POSIX信号,它什么也不做。如果进程正在运行,kill
将返回0
,如果没有,它将返回1
。ps $pid >/dev/null 2>&1
可以做同样的工作。要杀死进程,一般使用SIGQUIT/3
(退出程序)或SIGKILL/9
(终止程序);该进程可以捕获该信号并干净地退出,或者它可以忽略该信号,因此操作系统必须“快速而肮脏地”终止它。2.测试和'['
/bin/[
),并期待您没有正确提供的内容。while
的语法是while list; do list; done
,其中list
将返回一个退出代码,因此您不必使用其他代码。3.如何在shell脚本中监视进程是否已死亡?
与您所做的一样,下面的代码将完成这项工作:
注意我使用
/bin/bash
作为解释器,因为某些Bourne Shell(sh
)不支持使用数组(即spin[n]
)。qxsslcnc2#
在后台运行spinner,并在进程(在前台运行)终止时杀死它可能会更干净。或者,你可以打开另一个文件描述符,并在后台进程终止后向其中写入一些内容,然后让主进程阻塞读操作。例如: