Linux命令行下如何通过管道传节点名至SSH以核查节点作业状态?
解决方法:单条命令核查目标节点的进程状态
你的问题出在xargs的默认参数传递方式上——它会把提取到的节点名直接追加到ssh ps aux的末尾,变成ssh ps aux node02 node22,这显然不符合SSH的语法(正确格式是ssh 主机名 "要执行的命令")。下面提供两种可行的单条命令方案:
方案一:用xargs -I指定参数替换位置
qstat | awk '/@/ {split($8, arr, "@"); print arr[2]}' | xargs -I {} ssh {} "ps aux | grep amp_run.py | grep -v grep"
awk '/@/ {split($8, arr, "@"); print arr[2]}':直接在awk里拆分队列字段(skylake@node02),提取出节点名,比用cut更简洁。xargs -I {}:指定用{}作为节点名的占位符,把每个节点名放到ssh的主机位置,然后执行后续的进程查询命令。grep -v grep:排除grep amp_run.py这个自身进程,避免干扰结果。
方案二:用awk生成完整命令后交给bash执行
qstat | awk '/@/ {split($8, arr, "@"); print "ssh " arr[2] " \"ps aux | grep amp_run.py | grep -v grep\""}' | bash
这个思路更直观:让awk直接输出每个节点对应的SSH命令,然后通过管道传给bash执行,你还可以去掉| bash提前预览要执行的命令,方便调试。
优化:添加节点标识方便区分结果
如果想清楚知道每个结果属于哪个节点,可以给命令加个节点提示:
qstat | awk '/@/ {split($8, arr, "@"); print arr[2]}' | xargs -I {} sh -c 'echo "=== 正在核查节点 {} ==="; ssh {} "ps aux | grep amp_run.py | grep -v grep"'
内容的提问来源于stack exchange,提问作者Joonho Park
相关产品推荐
相关产品推荐

