1

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

我从以下帖子中得到了一些想法。 bash 脚本来检查正在运行的进程

我需要添加这个,如果正在运行的服务数量 < 4,则启动另一个进程。

请帮我解决这个问题。

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

工作.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

我的.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 中的值。

请让我知道我在哪里做错了。

先感谢您!!!

4

5 回答 5

2

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

于 2012-07-03T07:34:46.030 回答
1

有:用于这种目的的pbzip2并行bzip2压缩。此外,7z 有多线程选项,但我没有尝试过

我通常使用这种设置:

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

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

于 2012-07-04T23:13:44.983 回答
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 )。你爱你的命令行。

于 2014-01-17T22:26:22.617 回答
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
于 2014-01-17T22:43:03.620 回答
-1

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

假设创建一个文件夹bash。在里面,创建其他 2 个文件夹(backupdirectory)。将这 21 个文件夹放入directory. 创建 2 个文件(使.sh文件可执行)。

启动.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 温度。

于 2012-07-04T22:41:17.313 回答