【问题标题】:Bash script to complete 21 process by running 4 process parallel通过并行运行 4 个进程来完成 21 个进程的 Bash 脚本
【发布时间】:2012-07-03 06:34:58
【问题描述】:

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

我从以下帖子中得到了一些想法。 bash script to check running process

我需要这个添加,如果正在运行的服务数量

请帮我解决这个问题。

我的脚本如下。这里我使用 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

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

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

提前谢谢你!!!

【问题讨论】:

标签: bash


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    pbzip2: parallel bzip2 compression 用于这种目的。另外,7z 有多线程选项,但我没试过

    我通常使用这种设置:

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

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

    【讨论】:

      【解决方案3】:

      使用 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)。你爱你的命令行。

      【讨论】:

        【解决方案4】:

        在“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
        

        【讨论】:

          【解决方案5】:

          我认为您有四核,因此有 4 个进程。错误的解决方案。 相反,计算核心数量(这样它可以扩展到双核、四核、6 核等,而无需手动更改进程变量)。 这个例子是我能并行运行 bash 的最好例子。它是通过将任务划分为您获得的核心数量,克隆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
          

          和脚本.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 温度。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-12
            • 2013-06-19
            • 1970-01-01
            • 2020-01-25
            • 2016-09-09
            • 1970-01-01
            相关资源
            最近更新 更多