Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何并行而不是顺序地运行bash脚本? #/bin/bash some_数组=(1美元) echo”--设置虚拟机--” 对于${some_数组[@]}中的i;做 回音“VM:$i” 中的“$i”格 "1") 回显“设置VM$i” sshpass-p“root12”ssh-tt-o strichhostkeychecking=noroot@10.xx.x.xx_Linux_Bash_Gnu Parallel - Fatal编程技术网

Linux 如何并行而不是顺序地运行bash脚本? #/bin/bash some_数组=(1美元) echo”--设置虚拟机--” 对于${some_数组[@]}中的i;做 回音“VM:$i” 中的“$i”格 "1") 回显“设置VM$i” sshpass-p“root12”ssh-tt-o strichhostkeychecking=noroot@10.xx.x.xx

Linux 如何并行而不是顺序地运行bash脚本? #/bin/bash some_数组=(1美元) echo”--设置虚拟机--” 对于${some_数组[@]}中的i;做 回音“VM:$i” 中的“$i”格 "1") 回显“设置VM$i” sshpass-p“root12”ssh-tt-o strichhostkeychecking=noroot@10.xx.x.xx,linux,bash,gnu-parallel,Linux,Bash,Gnu Parallel,将每个案例。。。esac语句在后台以&结尾。然后在循环后使用wait,等待所有后台进程完成 #!/bin/bash some_array=($1) echo "-- Setting-Up VM --" for i in ${some_array[@]}; do echo "VM #: $i" case "$i" in "1") echo "Setti

将每个
案例。。。esac
语句在后台以
&
结尾。然后在循环后使用
wait
,等待所有后台进程完成

#!/bin/bash

some_array=($1)

echo "-- Setting-Up VM --"

for i in ${some_array[@]}; do
    echo "VM #: $i"

    case "$i" in

        "1")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;

        "2")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;

        "3")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;
        *)
        echo "unknown VM!"
        ;;
    esac
done
#/bin/bash
some_数组=(1美元)
echo”--设置虚拟机--”
对于${some_数组[@]}中的i;做
回音“VM:$i”
中的“$i”格
"1")
回显“设置VM$i”

sshpass-p“root12”ssh-tt-o strichhostkeychecking=noroot@10.xx.x.xx将每个
案例。。。esac
语句在后台以
&
结尾。然后在循环后使用
wait
,等待所有后台进程完成

#!/bin/bash

some_array=($1)

echo "-- Setting-Up VM --"

for i in ${some_array[@]}; do
    echo "VM #: $i"

    case "$i" in

        "1")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;

        "2")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;

        "3")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;
        *)
        echo "unknown VM!"
        ;;
    esac
done
#/bin/bash
some_数组=(1美元)
echo”--设置虚拟机--”
对于${some_数组[@]}中的i;做
回音“VM:$i”
中的“$i”格
"1")
回显“设置VM$i”

sshpass-p“root12”ssh-tt-o strichhostkeychecking=noroot@10.xx.x.xx既然所有这些都是相同的,为什么还要有一个案例陈述呢

#!/bin/bash

some_array=($1)

echo "-- Setting-Up VM --"

for i in ${some_array[@]}; do
    echo "VM #: $i"

    case "$i" in

        "1")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;

        "2")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;

        "3")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;
        *)
        echo "unknown VM!"
        ;;
    esac &
done

wait
这只是因为here文档而让人困惑,但是
&
元字符在我的系统上仍然可以正确解析。试试看

此外,与其在一个字符串中引用所有选项,然后将它们解析回一个数组,为什么不简化整个过程,让它们作为单独的参数输入呢?称之为

sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@$IP <<EOF &
循环就变得公正了

./vmSetup.sh 1 2 3 # NOT "1 2 3" with quotes
这整件事看起来简单多了,维护起来也容易多了

另一个选项,这就是我要做的:创建一个文件,它是您需要的DNS/IP地址的列表,然后将该文件作为单独的参数传递

for i in "$@" # properly quoted, though wouldn't matter for 1 2 3
#/bin/bash
读时-r addr | |[[-n“$addr”]]
执行echo“设置VM$addr”

sshpass-p“root12”ssh-tt-o strichhostkeychecking=no root@$addr当所有这些都相同时,为什么还要有case语句

#!/bin/bash

some_array=($1)

echo "-- Setting-Up VM --"

for i in ${some_array[@]}; do
    echo "VM #: $i"

    case "$i" in

        "1")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;

        "2")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;

        "3")
        echo "Setting-Up VM $i"
        sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@10.xx.x.xx <<EOF
        pwd
        nohup yes | /etc/rc.d/init.d/lifconfig
        su tarts
        nohup yes | vncserver
        sleep 10
        exit
        exit
EOF
        ;;
        *)
        echo "unknown VM!"
        ;;
    esac &
done

wait
这只是因为here文档而让人困惑,但是
&
元字符在我的系统上仍然可以正确解析。试试看

此外,与其在一个字符串中引用所有选项,然后将它们解析回一个数组,为什么不简化整个过程,让它们作为单独的参数输入呢?称之为

sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@$IP <<EOF &
循环就变得公正了

./vmSetup.sh 1 2 3 # NOT "1 2 3" with quotes
这整件事看起来简单多了,维护起来也容易多了

另一个选项,这就是我要做的:创建一个文件,它是您需要的DNS/IP地址的列表,然后将该文件作为单独的参数传递

for i in "$@" # properly quoted, though wouldn't matter for 1 2 3
#/bin/bash
读时-r addr | |[[-n“$addr”]]
执行echo“设置VM$addr”

sshpass-p“root12”ssh-tt-o strichhostkeychecking=no root@$addr如果
/vmSetup.sh 1
按预期工作,则这些应该工作:

#!/bin/bash
while read -r addr || [[ -n "$addr" ]]
do echo "Setting-Up VM $addr"
sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@$addr <<EOF &
  pwd
  nohup yes | /etc/rc.d/init.d/lifconfig
  su tarts
     nohup yes | vncserver
     sleep 10
     exit
  exit
EOF
done < "$1"

如果
/vmSetup.sh 1
按预期工作,则这些应能工作:

#!/bin/bash
while read -r addr || [[ -n "$addr" ]]
do echo "Setting-Up VM $addr"
sshpass -p "root12"  ssh -tt -o StrictHostKeyChecking=no root@$addr <<EOF &
  pwd
  nohup yes | /etc/rc.d/init.d/lifconfig
  su tarts
     nohup yes | vncserver
     sleep 10
     exit
  exit
EOF
done < "$1"


谢谢Barmar,但是有没有办法用GNU Parallel做到这一点呢?可能吧。但是由于我不熟悉GNU parallel,所以在我的回答中没有使用它。为什么不使用GNU parallel来运行整个脚本呢?我如何使用GNU parallel来实现呢?我不知道如何使用该软件包,即使我已经在我的虚拟机上安装了它?其次,你能告诉我如何同时并行运行8个案例吗?就像我说的,我不熟悉GNU并行。问一下如何使用它会是一个更好的地方。谢谢Barmar,但也有办法用GNU Parallel实现吗?可能吧。但是由于我不熟悉GNU parallel,所以在我的回答中没有使用它。为什么不使用GNU parallel来运行整个脚本呢?我如何使用GNU parallel来实现呢?我不知道如何使用该软件包,即使我已经在我的虚拟机上安装了它?其次,你能告诉我如何同时并行运行8个案例吗?就像我说的,我不熟悉GNU并行。询问如何使用它会是一个更好的地方。关于herdeoc的注意:
EOF
必须是herdeoc结尾行上的唯一字符:不允许使用前导空格。如果你使用
@glennjackman,你可以使用前导标签,这是我在修复其余缩进时的错误。在我的编辑之前,这是正确的。为什么您首先有
case
语句?所有的案例都做同样的事情。我如何只使用一个案例语句,然后使用我在脚本中给出的25个案例中的任何一个?两种情况之间的区别仅在于IP地址。有关heredoc的注意事项:
EOF
必须是heredoc结尾行上的唯一字符:不允许使用前导空格。如果你使用
@glennjackman,你可以使用前导标签,这是我在修复其余缩进时的错误。在我的编辑之前,这是正确的。为什么您首先有
case
语句?所有的案例都做同样的事情。我如何只使用一个案例语句,然后使用我在脚本中给出的25个案例中的任何一个?案例之间的区别只是IP地址。是的,你能告诉我如何使用一个案例语句并缩短脚本吗。IP是唯一的区别。啊!好啊编辑。是的,你能告诉我如何只用一个case语句并缩短脚本吗。IP是唯一的区别。啊!好啊编辑。