首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash:使用pkill跟踪删除目录的进度

Bash:使用pkill跟踪删除目录的进度
EN

Stack Overflow用户
提问于 2016-03-28 14:45:06
回答 2查看 1.4K关注 0票数 0

因此,我有一个shell脚本,它执行一些长的操作,当它们运行时,我只想输出一系列的点(.)直到它完成,以显示它在运行。

我使用pkill来测试进程是否正在运行,只要它是运行的,它就会输出另一个点。这对我需要的几乎每一个地方都很有效。然而,这个过程的一个部分涉及删除一个目录,这就是它崩溃的地方。

这是我的代码:

代码语言:javascript
复制
ERROR=$(rm -rf "$1" 2>&1 >/dev/null)
    while pkill -0 rm; do
        printf "."
        sleep 1
    done
    printf "\n"

我使用pkill来测试rm进程,但是当我测试时,这就是我得到的输出:

代码语言:javascript
复制
pkill: signalling pid 192: Operation not permitted

pkill: signalling pid 326: Operation not permitted

.pkill: signalling pid 61: Operation not permitted

我的脚本一直运行到点输出代码,包括删除文件夹,但是它会停止,只会一遍又一遍地输出这三行,直到我强制终止进程。

有人知道怎么回事吗?我觉得它不能和rm手术一起工作,但我不确定。

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-28 14:57:56

问题是,pkill正在为Regex模式rm匹配的进程发送kill(PID, SIG_0)。对于某些匹配的进程(由PID显示),您没有足够的权限发送SIG_0以获取进程状态。

您可以使用-x (--exact)选项(no )来匹配只使用确切名称rm的进程(Es)(假设其他运行的用户没有rm ):

代码语言:javascript
复制
pkill -0 -x rm

或者使用pgrep

代码语言:javascript
复制
pgrep -x rm

最好提到你的用户名:

代码语言:javascript
复制
pkill -0 -x -u username rm
pgrep -x -u username rm
票数 2
EN

Stack Overflow用户

发布于 2016-03-28 14:53:09

您的脚本没有将rm放到后台,因此在运行pkill时,它可能是在查找其他用户拥有的进程,并且无法杀死它们,因为除非您是root用户,否则无法杀死另一个用户的进程。

由于您是在脚本中生成进程,如果您正确地背景了rm,那么您可以从$!获得rm作业的PID,并使用kill而不是pkill

您应该运行rm命令并正确地备份它。以下未经测试的代码应该执行您想要做的事情:

代码语言:javascript
复制
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文档。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36264690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档