linux bash shell 多线程脚本无法并处处理命令
发布网友
发布时间:2022-05-15 02:45
我来回答
共2个回答
热心网友
时间:2023-10-03 17:12
一堆的错误,帮你改了。自己diff一下就明白了。
下次贴问题之前,请确保你的代码能执行……
另外,之所以是串行,是因为你根本就没有执行过文件里的命令,而永远是 sleep 同样长的时间,当然最终的效果就是串行,你可以改成 sleep 随机长的时间,或者确实的执行文件里的命令,就能看到并行效果了 (确保命令做一些 IO 操作,或者多核cpu)。
#!/bin/bash
if [ -z "$1" ];then
echo "Usage:`basename $0` filename(containing the cmd you want to execute)"
exit 1
else
if [ ! -f "$1" ];then
echo "The file \"$1\" you provide doesn't exist!"
exit 1
else
cmdfile=$1
jobnum=`cat $cmdfile|grep -v "^#"|grep -v "^[[:space:]]#"|wc -l`
line=`cat $cmdfile|wc -l`
fi
fi
#创建管道文件,并将其文件描述符设置为6,同时以读写的方式打开它
tmp_fifo="tmp$$.fifo"
mkfifo ${tmp_fifo}
exec 6<> ${tmp_fifo}
#限定线程数的上限
thread=3
for(( i=0;i<$thread;i++ ))
do
echo
done >&6
for(( j=0;j<${line};j++ ))
do
read -u 6
{
read command
if [ -n "`echo $command|grep -v "^#"`" ] && [ -n "`echo $command|grep -v "[[:space:]]#"`" ];then
echo "[`date +"%Y%m%d %H:%M:%S"`]:command is $command,j is $j"
sleep 3
echo "[`date +"%Y%m%d %H:%M:%S"`]:job $j finishes successfully!">>/tmp/multpro_`date +%Y%m%d`.log
fi
#作业完成后向管道文件写回一个按行符
echo >&6
}&
done < "$cmdfile"
wait
exec 6<&-
rm ${tmp_fifo}
exit 0
追问我们的服务器不能使用U盘,所以我拍照后对着打出来的。非常感谢你改过来了。我后来在自己的机器试了一下,是可以的。不是sleep和核心的问题。我的机器是双核处理器bash 为4.2.10(1)-release;服务器的是双CPU的,每个cpu四核心,bash是3.00.15。估计是bash版本不同。
热心网友
时间:2023-10-03 17:13
试了一下脚本,看日志的任务结束顺序是随机的嘛,这不就是“并行”的嘛。