因此,我有一个shell脚本,它执行一些长的操作,当它们运行时,我只想输出一系列的点(.)直到它完成,以显示它在运行。
我使用pkill来测试进程是否正在运行,只要它是运行的,它就会输出另一个点。这对我需要的几乎每一个地方都很有效。然而,这个过程的一个部分涉及删除一个目录,这就是它崩溃的地方。
这是我的代码:
ERROR=$(rm -rf "$1" 2>&1 >/dev/null)
while pkill -0 rm; do
printf "."
sleep 1
done
printf "\n"我使用pkill来测试rm进程,但是当我测试时,这就是我得到的输出:
pkill: signalling pid 192: Operation not permitted
pkill: signalling pid 326: Operation not permitted
.pkill: signalling pid 61: Operation not permitted我的脚本一直运行到点输出代码,包括删除文件夹,但是它会停止,只会一遍又一遍地输出这三行,直到我强制终止进程。
有人知道怎么回事吗?我觉得它不能和rm手术一起工作,但我不确定。
提前谢谢。
发布于 2016-03-28 14:57:56
问题是,pkill正在为Regex模式rm匹配的进程发送kill(PID, SIG_0)。对于某些匹配的进程(由PID显示),您没有足够的权限发送SIG_0以获取进程状态。
您可以使用-x (--exact)选项(no )来匹配只使用确切名称rm的进程(Es)(假设其他运行的用户没有rm ):
pkill -0 -x rm或者使用pgrep
pgrep -x rm最好提到你的用户名:
pkill -0 -x -u username rm
pgrep -x -u username rm发布于 2016-03-28 14:53:09
您的脚本没有将rm放到后台,因此在运行pkill时,它可能是在查找其他用户拥有的进程,并且无法杀死它们,因为除非您是root用户,否则无法杀死另一个用户的进程。
由于您是在脚本中生成进程,如果您正确地背景了rm,那么您可以从$!获得rm作业的PID,并使用kill而不是pkill。
您应该运行rm命令并正确地备份它。以下未经测试的代码应该执行您想要做的事情:
rm -rf "$1" >/dev/null 2>&1 &
RMPID=$!
while kill -0 $RMPID 2>/dev/null; do
printf "."
sleep 1
done
printf "\n"
wait $RMPID
RESULT=$?
if (( $RESULT != 0 )); then
printf "Error when deleting $1\n"
exit 1
fi有关wait、$!和$?的更多细节,您可以阅读bash文档。
https://stackoverflow.com/questions/36264690
复制相似问题