扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
如果您维护多个Linux服务器,则有时您希望在所有服务器上运行相同的命令。例如,您可能希望安装/升级软件包,修补内核以及更新配置等。如果您必须登录到每个服务器并手动运行相同的命令,那将是一项繁琐的工作。
在聊城等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供成都网站制作、做网站 网站设计制作按需定制,公司网站建设,企业网站建设,成都品牌网站建设,全网营销推广,外贸网站制作,聊城网站建设费用合理。
这篇文章是关于一个管理工具,它允许您一次在许多不同的机器上运行相同的命令。
通过ClusterSSH,您可以同时在多个主机上进行相同的更改。它提供了一个特殊的控制台界面,您在控制台中输入的任何内容都会自动发送到任意数量的主机。
在Linux上安装ClusterSSH
在Ubuntu,Debian或Linux Mint上安装ClusterSSH:
$ sudo apt-get install clusterssh
要在CentOS或RHEL上安装ClusterSSH,首先需要设置EPEL存储库,然后运行以下命令。
$ sudo yum install clusterssh
要在Fedora上安装ClusterSSH,只需运行:
$ sudo yum install clusterssh
配置ClusterSSH
安装后,第一步是定义要在其上运行命令的主机群集。为此,请按如下方式创建系统范围的ClusterSSH配置文件。
$ sudo vi / etc / clusters
clusters = my_cluster my_cluster2
my_cluster = host1 host2 host3 host4
my_cluster2 = host5 host6
如果您需要特定于用户的ClusterSSH配置,只需使用〜/ .csshrc而不是/ etc / clusters。在上面的示例配置中,我定义了两个集群:“my_cluster”由四个主机组成,“my_cluster2”包含两个主机。群集是您要登录并运行命令的一组主机。
当您使用任何用户定义的群集启动ClusterSSH时,它将使用ssh登录到群集中的各个主机,并在主机上运行任何用户类型的命令。
启动ClusterSSH
要启动ClusterSSH,请按如下方式运行cssh命令。
$ cssh -l dev my_cluster
在上文中,“dev”是群集中所有主机的登录ID,“my_cluster”是群集名称。
如果需要,可以指定单个主机名而不是群集名。
$ cssh -l dev host1 host2 host3
一旦CSSH执行命令时,它会弹出用于单个主机的XTerm窗口,以及标记的一个小窗口“CSSH [2]”,其是ClusterSSH控制台窗口。无论您在控制台窗口中输入什么,都将同时出现在各个主机的XTerm窗口中。基本上,您可以通过单一控制台窗口控制所有XTerm窗口。
如果要将某些命令运行到特定的XTerm窗口,只需将焦点切换到Xterm窗口,然后像往常一样键入命令。
以下屏幕截图显示了ClusterSSH的运行情况,其中群集中有五个主机,左上角的控制台窗口是您应该键入要在所有五个主机上运行的命令的位置。
转自 嘉为教育-rhce认证_rhce培训_linux培训_linux认证_linux考证
(run1.sh ) ; (run2.sh ) ; (run3.sh)
如果还有继续加
一次执行多个命令可以将多个命令用英文分号分割,比如像这样:
mkdir /tmp/mydir; touch /tmp/mydir/myfile
其实这样也不能算是同时执行,Linux的命令是顺序执行的,就算是shell脚本,里面写了一大堆命令,同样也顺序执行的。如果前一个命令执行的时间比较长,后面的命令就只有等待了。如果命令执行时间比较长,又想让命令同时执行,恐怕只能打开多个虚拟终端才行(右键虚拟终端界面,选择“打开标签”),打开多个登录的虚拟终端其实是运行了多个“会话”,多个“会话”中的命令才是“同时”执行。
GNU Parallel的输入源支持文件、命令行和标准输入(stdin或pipe)。
当然,若不想像上面那样进行组合,可使用 --xapply 参数从每一个源获取一个参数(或文件一行),这个参数有些类似R中的函数,具有广播作用——如果其中一个输入源的长度比较短,它的值会被重复。
GNU Parallel可以通过 --arg-sep 和 --arg-file-sep 指定分隔符替代 ::: 或 ::::,当这两个符号被其它命令占用的时候会特别有用。
GNU Parallel默认把一行做为一个参数:使用 \n 做为参数定界符。可以使用 -d 改变:
GNU Parallel支持通过 -E 参数指定一个值做为结束标志:
GNU Parallel使用 --no-run-if-empty 来跳过空行:
如果parallel之后没有给定命令,那么这些参数会被当做命令:
此外,命令还可以是一个脚本文件,一个二进制可执行文件或一个bash的函数(须用 export -f 导出函数)
GNU Parallel支持多种替换字符串,默认使用 {},使用 -I 改变替换字符串符号 {}。其最常见的字符串替换包括以下几种: {.} ,去掉扩展名; {/} ,去掉路径,只保留文件名; {//} ,只保留路径; {/.} ,同时去掉路径和扩展名; {#} ,输出任务编号。同时对于每一个字符串替换都可以自己指定符号: -I 对应 {} ; --extensionreplace 替换 {.} ; --basenamereplace 替换 {/} ; --dirnamereplace 替换 {//} ; --basenameextensionreplace 替换 {/.} ; --seqreplace 替换 {#} 。
同时,如果有多个输入源时,可以通过 {编号} 指定某一个输入源的参数:
使用 --header 把每一行输入中的第一个值做为参数名。
使用 --colsep 把文件中的行切分为列,做为输入参数。
--xargs 会在一行中输入尽可能多的参数(与参数字符串长度有关),通过 -s 可指定一行中参数的上限。
为了获得更好的并发性,GNU Parallel会在文件读取结束后再分发参数。
GNU Parallel 在读取完最后一个参数之后,才开始第二个任务,此时会把所有的参数平均分配到4个任务(如果指定了4个任务)。
第一个任务与上面使用 --xargs 的例子一样,但是第二个任务会被平均的分成4个任务,最终一共5个任务。(奇怪的是我的结果与官网教程的结果不一样)
替换字符串可以是输出字符的一部分,使用 -m 参数表示每个job不重复输出“背景”(context), -X 则与 -m 相反,会重复输出“背景文本”,具体通过下面几个例子进行理解:
使用 -N 限制每行参数的个数,其中 -N0 表示一次只读取一个参数,且不输入这个参数(作为计数器来使用)。
如果命令行中包含特殊字符,就需要使用引号保护起来。
perl脚本 'print "@ARGV\n"' 与linux的 echo 的功能一样。
使用GNU Parallel运行这条命令的时候,perl命令需要用引号包起来,也可以使用 -q 保护perl命令:
使用 --trim 去除参数两头的空格:
使用 --tag 以参数做为输出前缀,使用 --tagstring 修改输出前缀:
--dryrun 作用类似于echo:
--verbose 则在运行之前先打印命令:
一般来说,GNU Parallel 会延迟输出,直到一组命令执行完成。使用 --ungroup ,可立刻打印输出已完成部分。
使用 --ungroup 会很快,但会导致输出错乱,一个任务的行输出可能会被另一个任务的输出截断。像上例所示,第二行输出混合了两个任务: '4-middle' '2-start'。使用 --linebuffer 避免这个问题(稍慢一点):
强制使输出与参数保持顺序 --keep-order/-k :
GNU Parallel可以把每一个任务的输出保存到文件中,临时文件默认保存在 /tmp 中,可以使用 --tmpdir改变(或者修改 $TMPDIR):
输出文件可以有结构的保存 --results ,输出文件不仅包含标准输出(stdout)也会包含标准错误输出(stderr):
在使用多个变量的时候会显示很有用:
使用 --jobs/-j 指定并行任务数。
通过使用 --interactive 在一个任务执行之前让用户决定是否执行。
当job有大量的IO操作时,为避免 “惊群效应” ,可使用 --delay 参数指定各个job开始的时间间隔。
若已知任务超过一定时间未反应则为失败则可以通过 --timeout 指定等待时间避免无谓的等待。GNU parallel能计算所有任务运行时间的中位数,因此可以指定时间为中位数的倍数关系。
GNU parallel有多种方式可用来动态的显示任务进度信息,如:
使用 --joblog 参数能够生成各个任务的日志文件:
通过 --resume-failed 参数可以重新运行失败的任务; --retry-failed 的作用与 --resume-failed 类似,只是 --resume-failed 从命令行读取失败任务,而 --retry-failed 则是从日志文件中读取失败任务:
GNU parallel支持在某一情况下(如第一个失败或成功时,或者20%任务失败时)终止任务,终止任务又有两种类型,其一为立即终止(通过 --halt now 指定),杀死所有正在运行的任务并停止生成新的任务,其二为稍后终止(通过 --halt soon 指定),停止生成新任务并等待正在运行任务完成。
GNU parallel还支持在任务失败后重试运行 --retries :
关于终止信号的高级用法参考 官方入门文档 。
GNU parallel能够在开始一个新的任务前检查系统的负载情况防止过载(通过 --load 可指定负载),同时还能检查系统是否使用了交换空间(swap)(通过 --noswap 限制使用swap)。
同时,对于某些占用内存较多的程序,parallel会检查内存只有内存满足时才启动任务(通过 --memfree 指定需要内存大小),而且在启动任务后内存不够50%时会杀掉最新开始的任务,直到这个任务完成再重新开始那些杀死的任务。
还可以通过 --nice 来指定任务的优先级。
可使用 -S host 来进行远程登陆:
parallel -S username@$SERVER1 echo running on ::: username@$SERVER1
GNU parallel 文件传输使用的是rsync。
更多远程操作参见入门文档。
--pipe 参数使得我们可以将输入(stdin)分为多块(block),然后分配给多个任务多个cpu以达到负载均衡,最后的结果顺序与原始顺序一致。使用 --block 参数可以指定每块的大小,默认为1M。
如果不关心结果顺序,只想要快速的得到结果,可使用 --round-robin 参数。没有这个参数时每块文件都会启动一个命令,使用这个参数后会将这些文件块分配给job数任务(通过 --jobs 进行指定)。若想分配更为均匀还可同时指定 --block 参数。
参考:
官方文档
GNU Parallel指南
parallel是一个Linux命令行并行工具(mac也可以用)
这里只说一种简单的用法,基本上能满足日常工作需求,
假设当前目录有三个 *.txt 文件,我们使用gzip对着三个文件进行压缩
1.顺序执行语句:
2.parallel并行版本
3.读取命令版本
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流