Bash脚本运行时执行循环任务失败:无法检测进程运行状态
问题解决方法
问题根源
你之前的核心错误是把传入的命令字符串($1,即./test.sh)当成了进程ID(PID)来使用kill -0,但kill -0需要的是有效的进程ID,不是命令名,所以循环条件始终不成立,自然无法打印"Here"。另外,用/usr/bin/time(别名cf)运行目标脚本时,/usr/bin/time本身是父进程,目标脚本是它的子进程,需要正确监控对应的PID。
修正后的statistics.sh脚本
#!/bin/bash # 定义别名cf指向/usr/bin/time alias cf='/usr/bin/time' # 接收传入的目标脚本命令 target_cmd="$1" # 后台运行cf(即/usr/bin/time),同时将统计信息输出到临时文件 # 记录/usr/bin/time进程的PID cf "$target_cmd" 2> time_statistics.txt & monitor_pid=$! # 循环监控进程是否存活,每秒打印一次"Here" while kill -0 $monitor_pid 2>/dev/null; do echo "Here" sleep 1 done # 等待统计进程结束,输出统计结果 wait $monitor_pid echo -e "\n统计信息:" cat time_statistics.txt
说明
- 获取正确PID:用
&将cf命令后台运行后,$!会返回刚启动的/usr/bin/time进程的PID,这个进程会持续到目标脚本test.sh执行完毕才退出,所以监控它的PID就能判断目标脚本是否在运行。 - 循环逻辑:
kill -0 $monitor_pid仅检查进程是否存在,不会发送任何信号,加上2>/dev/null屏蔽错误输出,当进程存活时循环继续,每秒打印"Here"。 - 统计信息处理:
/usr/bin/time默认将统计信息输出到标准错误(stderr),所以用2> time_statistics.txt将其重定向到文件,最后等待进程结束后再打印统计内容。
运行验证
执行./statistics.sh './test.sh',会每秒输出一次"Here",持续5秒后,输出test.sh的"Program is done.",最后显示/usr/bin/time的统计数据。
内容的提问来源于stack exchange,提问作者user18184114
相关产品推荐
相关产品推荐

