Shell脚本实现进度条的两种方式(shell脚本运行程序)不要告诉别人

随心笔谈2年前发布 admin
156 0 0

文章摘要

这篇文章讲述了一个使用Bash脚本实现的信号处理程序。该脚本通过`trap`和函数`onCtrlC`捕获用户按下`Ctrl+C`时的事件,并在此时终止后台进程中运行的两个进程:`do_sth`和`progress`。 具体来说,`do_sth`用于执行主任务,`progress`则动态生成进度条。当`Ctrl+C`被触发时,脚本调用`kill`命令终止这两个进程,并在控制台输出提示信息。整个脚本通过进程控制和信号处理,实现了在用户干预下自动终止运行的进程功能。

#!/bin/bash

trap ‘onCtrlC’ INT
function onCtrlC () {
#捕获CTRL+C,当脚本被ctrl+c的形式终止时同时终止程序的后台进程
kill -9 ${do_sth_pid} ${progress_pid}
echo
echo ‘Ctrl+C is captured’
exit 1
}

do_sth() {
#运行的主程序
sleep 10
}

progress() {
#进度条程序
local main_pid=$1
local length=20
local ratio=1
while [ “$(ps -p ${main_pid} | wc -l)” -ne “1” ] ; do
mark=’>’
progress_bar= for i in $(seq 1 “${length}”); do
if [ “$i” -gt “${ratio}” ] ; then
mark=’-‘
fi
progress_bar=”${progress_bar}${mark}”
done
printf “Progress: ${progress_bar}\r”
ratio=$((ratio+1))
#ratio=`expr ${ratio} + 1`
if [ “${ratio}” -gt “${length}” ] ; then
ratio=1
fi
sleep 0.1
done
}

do_sth &
do_sth_pid=$(jobs -p | tail -1)

progress “${do_sth_pid}” &
progress_pid=$(jobs -p | tail -1)

wait “${do_sth_pid}”
printf “Progress: done \n”

© 版权声明

相关文章