我经常在几个不同的集群上运行作业,并且想用一个小的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"
这给了我一个找不到刮刀的命令。
我还尝试将内部命令放入“外部”服务器中的脚本中并运行
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连接的上述输出,而不必手动注销服务器。
如果我忽略了回答我的问题的线索,在此先感谢您的帮助和歉意!
答案 0 :(得分:1)
以下内容对我有用(假设您具有在clusterX上无需密码即可ssh到clusterY的密钥):
printf "\n Jobs on Cluster Y \n \n"
echo "echo 'squeue -u user' | ssh user@clusterYname" | ssh user@clusterXname
printf "\n"
我从未尝试过使用ssh来bash -c
,但是将命令作为字符串进行管道传输似乎总是可行。