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