我正在编写一个脚本,在shell中运行一个命令并花费2分钟。 每次。 而且,我们也无能为力。 但是,如果我想在脚本中运行这个命令100次,那么总的时间将是200分钟。 这会造成一个大问题。 没有人想等200分钟。 我想要的是并行运行所有100个命令,以便输出将在2分钟内或可能是更多的时间,但不花费200分钟。
将不胜感激,如果任何机构可以以任何方式帮助我。
如何获得system()运行的命令的状态
使用awkparsing源代码
Shell脚本:比较中的错误(Linux)
跨行分割命令
GNU并行是你想要的,除非你想重新发明轮子。 这里有一些更详细的例子 ,但缺点是:
ls | parallel gzip # gzip all files in a directory
…并行运行所有100个命令,以便在2分钟内输出
这只有当你的系统上有200个处理器时才可能。
在shell脚本中没有这样的实用程序/命令来并行运行命令。 你可以做的是在后台运行你的命令:
for ((i=0;i<200;i++)) do MyCommand & done
使用& (后台),每个执行都会尽快安排。 但是这并不能保证你的代码将在200分钟内执行。 这取决于您的系统上有多少处理器。
如果你只有一个处理器,每执行一次命令(需要2分钟)就进行一些计算2分钟,那么处理器正在做一些工作,这意味着没有浪费周期。 在这种情况下,并行运行命令不会有帮助,因为只有一个处理器也不是免费的。 所以,这个过程将会等待他们的执行。
如果你有多个处理器,那么上面的方法(for循环)可能有助于减少总的执行时间。
正如@KingsIndian所说,你可以做后台任务,让他们平行运行。 除此之外,您还可以通过进程ID跟踪他们:
#!/bin/bash # Function to be backgrounded track() { sleep $1 printf "nFinished: %dn" "$1" } start=$(date '+%s') rand3="$(jot -s -r 3 5 10)" # If you don't have `jot` (*BSD/OSX),substitute your own numbers here. #rand3="5 8 10" echo "Random numbers: $rand3" # Make an associative array in which you'll record pids. declare -A pids # Background an instance of the track() function for each number,record the pid. for n in $rand3; do track $n & pid=$! echo "Backgrounded: $n (pid=$pid)" pids[$pid]=$n done # Watch your stable of backgrounded processes. # If a pid goes away,remove it from the array. while [ -n "${pids[*]}" ]; do sleep 1 for pid in "${!pids[@]}"; do if ! ps "$pid" >/dev/null; then unset pids[$pid] echo "unset: $pid" fi done if [ -z "${!pids[*]}" ]; then break fi printf "rStill waiting for: %s ... " "${pids[*]}" done printf "r%-25s n" "Done." printf "Total runtime: %d secondsn" "$((`date '+%s'` - $start))"
你也应该看看关于coprocesses的Bash文档。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。