我经常在几个不同的集群上运行作业,并希望使用一个小的bash脚本检查SLURM和SGE作业的状态。
对于大多数集群,我都可以这样做
printf "\n Jobs on Cluster X \n \n"
ssh user@clusterXname bash -c "'
squeue -u user
exit
'"
printf "\n"这给了我一个类似这样的输出。
AXON上的作业
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
17251 gpu CL21E1 user R 4:38:15 1 gpu02-02
17252 gpu CL21E2 user R 4:37:06 1 gpu02-03
17253 gpu CL21E3 user R 4:36:27 1 gpu04-03
17254 gpu CL21E4 user R 4:35:23 1 gpu04-04
17255 gpu CL21E5 user R 4:34:46 1 gpu04-05但是,有一台服务器具有嵌套的SSH连接,因此我必须从一台服务器到另一台服务器进行SSH。
我尝试通过以下方式嵌套上面的代码
printf "\n Jobs on Cluster Y \n \n"
ssh user@clusterXname bash -c "'
ssh user@clusterYname bash -c '"
squeue -u user
exit
"'
exit
'"
printf "\n"这给了我一个没有为squeue找到的命令。
我还尝试将内部命令放入“外部”服务器的脚本中,并运行
printf "\n Jobs on Cluster X \n \n"
ssh user@clusterXname bash -c "'
bash job script.sh
exit
'"
printf "\n"在本例中,我得到了“伪终端将不会被分配,因为stdin不是一个终端”。如果我使用ssh -t而不是ssh,我确实会得到我想要的输出,但是我必须退出ssh连接。
因此,我要为嵌套的ssh连接寻找类似上面的输出,而不必手动注销服务器。
非常感谢你的帮助,如果我疏忽了回答我问题的帖子,我深表歉意!
发布于 2019-05-08 03:43:19
下面的方法适用于我(假设您在clusterX上有ssh到clusterY的密钥,而不需要密码):
printf "\n Jobs on Cluster Y \n \n"
echo "echo 'squeue -u user' | ssh user@clusterYname" | ssh user@clusterXname
printf "\n"我从未尝试过将bash -c与ssh一起使用,但是将命令作为字符串输入似乎总是有效的。
https://stackoverflow.com/questions/56024467
复制相似问题