Bash脚本通过并行运行4个进程来完成21个进程

时间:2012-07-03 06:34:58

标签: bash

我是脚本新手。 我有21个目录要压缩并复制到另一个位置。 我想并行运行4个进程,如果一个进程完成,则启动另一个进程。喜欢明智的21个目录应该完成。

我从后面的帖子中得到了一些建议。 bash script to check running process

我需要这个添加,如果运行服务的数量< 4,然后开始另一个过程。

请就此事帮助我。

我的脚本如下。这里我使用ping命令来测试进程。如果这是有效的,我可以安排它复制命令。

job.sh

#!/bin/bash

cat my.txt |while read line
do
 run_count=`ps eax | grep ping | grep -v grep | wc -l`
 if [ 4 -gt ${run_count} ]
 then
  /home/cms.sh $line &
 fi
done

cms.sh

#!/bin/bash
value=$1
cmd=ping
host=yahoo.com

$cmd -c $1 $host >> log-$1.txt

My.txt文件

100
250
150
174
182
140
320
139
150
120
110 
99
156
180
230
132
123
119
156
149
162

如果我运行它,它将开始使用my.txt中的前4行运行4个进程。完成初始4个进程后,它将不会继续保留my.txt中的值。

请告诉我错误的地方。

提前谢谢!!!

5 个答案:

答案 0 :(得分:2)

由于您不熟悉脚本,请查看xargs -P。即使您没有并行运行流程,这也是一个值得熟悉的命令,并且它比您在Mat指出的答案中提到的parallel更有可能预先安装在您的系统上。

答案 1 :(得分:1)

这种目的有pbzip2: parallel bzip2 compression。此外,7z有多线程选项,但我没有尝试过它们

我通常使用这种设置:

tar -cp somedir_tobackup/ | pbzip2 | mbuffer -m 180M | netcat <host> <port>

显然,您可以使用cpio,删除mbuffer,首先保存到本地存档文件,使用rsync等等,但想法就在那里。

答案 2 :(得分:0)

使用GNU Parallel,您可以:

cat my.txt | parallel /home/cms.sh

观看介绍视频,快速了解:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

完成教程(http://www.gnu.org/software/parallel/parallel_tutorial.html)。你命令行爱你。

答案 3 :(得分:0)

你的“do”之后需要第二个循环,它会重复睡眠1秒,直到没有4个进程在运行,然后它会从循环开始并在从控制文件中读取另一行之前启动一个新进程。像这样:

#!/bin/bash

while read line
do
   while :
   do
      run_count=`ps eax | grep  ping | grep -v grep | wc -l`
      [ 4 -gt ${run_count} ] && break;
      sleep 1
   done
   ./somejob $line &
done < my.txt

答案 4 :(得分:-1)

我估计你有4个核心因此4个进程。错误的解决方案。 相反,计算核心数量(这样它可以扩展到双核心,四核心,6核心等,而无需手动更改过程变量)。 这个例子是我在运行bash parallel时最好的例子。它是通过将任务划分为您拥有的核心数来实现的,克隆script.cfg在您拥有的核心数量中,在后台运行它们。 这样,每个核心只会压缩这些文件夹的一部分。

创建一个文件夹,让我们说bash。 在里面,创建其他2个文件夹(backupdirectory)。 将这21个文件夹放在directory中。 创建2个文件(使.sh文件可执行)。

start.sh

#!/bin/bash
date=$(date '+%d_%B_%Y')
mkdir backup/$date
cores=$(ls  /proc/acpi/processor/ | wc -l)
cd directory
ls > ../list.result
cd ..
file_lines=$(cat list.result | wc -l)
let "split_lines=$file_lines/$cores"
let "split_lines=$split_lines+1"
split -d --lines=$split_lines list.result CPU
for script in `seq 1 $cores`
do
    let sufix=script-1
    cat script.cfg > "CPU0$sufix.script"
    chmod +x CPU0$sufix.script
    sed -i 's/filenumber/CPU0'$sufix'/g' CPU0$sufix.script
    ./CPU0$sufix.script &
done
exit

和script.cfg

#!/bin/bash
date=$(date '+%d_%B_%Y')
lenght=$(cat filenumber |wc -l)
counter=1
for x in `seq 1 $lenght`
do
    value="directory/"$(sed "${x}!d" filenumber)
    tar -zcvf $value.tar.gz $value
    mv directory/*.tar.gz backup/$date
done
rm *.script CPU* list.result
exit

directory文件夹中的所有文件都将使用CPU中的所有核心进行压缩并移至备份文件夹。 这种技术可以100%运行所有内核,因此请注意CPU温度。