为什么在linuxshell中ssh远程执行脚本时退出
Why it is exit when ssh remote executed script in linux shell
在我的项目中,我需要找到在节点上处理的用户。
我有一个文件:jodIdUser。该文件中的内容有两列,如:
395163 chem-yupy
395164 chem-yupy
395165 phy-xiel
395710 mae-chent
现在我有一个脚本 appRecord.sh,我在其中有一个完整的循环。
while 方法代码如下:
cat $workDir/jobIdUser | while read LINE
do
jobUser=`echo $LINE | awk '{print }'`
jobId=`echo $LINE | awk '{print }'`
jobOnNodes=`/usr/bin/jobToNode $jobId | xargs`
echo $timeStr" "$jobId" "$jobUser" "$jobOnNodes >> $workDir/tmpRecFile
#20200702, it is needed to find out user process on nodes at this time here
designatedNode=`echo $jobOnNodes | awk '{print $NF}'`
echo $jobOnNodes
echo $designatedNode
ssh $designatedNode sh $workDir/nodeProInfo.sh ##Here code will exit while loop
echo $timeStr" "$jobId" "$jobUser" "$jobOnNodes >> $workDir/$recordFile
done
nodeProInfo.sh的代码如下:
#!/bin/bash
source /etc/profile
workDir=/work/ccse-xiezy/appRecord
hostName=`hostname`
jobInfo=`ps axo user:15,comm | grep -Ev "libstor|UID|ganglia|root|gdm|postfix|USER|rpc|polkitd|dbus|chrony|libstoragemgmt|para-test|ssh|ccse-x|lsf|lsbatch" | tail -n 1`
echo $hostName" "$jobInfo >> $workDir/proRes
现在我运行脚本sh appRecord.sh,是错误的。当 while
中的第一个循环时它将退出
[cc@login04 appRecord]$ sh appRecord.sh
r03n56 r04n09 r04n15
r04n15
[cc@login04 appRecord]$
不知道远程ssh节点方法为什么会退出,谁能帮帮我?
更新:
我有另一个脚本 运行ns ok。 jobIdUser 的内容如下:
r01n23 xxx-ser
r92n12 yyn-ser
while 循环是:
cat $workDir/jobIdUser | while read LINE
do
.............
ssh $NODE pkill -u -9 $USER
.............
done
cat $workDir/jobIdUser | while read LINE
do
...
ssh $designatedNode sh $workDir/nodeProInfo.sh ##Here code will exit while loop
...
done
ssh
(以及循环内的所有其他命令 运行)从 while
循环的标准输入继承其标准输入。默认情况下,ssh
读取其标准
输入并将数据传递给远程进程的标准输入。这意味着 ssh 正在消耗通过管道传输到循环中的数据,从而阻止 while
语句读取它。
您需要防止 ssh 读取其标准输入。您可以通过以下两种方式之一执行此操作。首先,-n
标志阻止 ssh 读取其标准输入:
ssh -n $designatedNode sh $workDir/nodeProInfo.sh
或者您可以从其他来源重定向 ssh 的标准输入:
ssh $designatedNode sh $workDir/nodeProInfo.sh < /dev/null
在我的项目中,我需要找到在节点上处理的用户。
我有一个文件:jodIdUser。该文件中的内容有两列,如:
395163 chem-yupy
395164 chem-yupy
395165 phy-xiel
395710 mae-chent
现在我有一个脚本 appRecord.sh,我在其中有一个完整的循环。 while 方法代码如下:
cat $workDir/jobIdUser | while read LINE
do
jobUser=`echo $LINE | awk '{print }'`
jobId=`echo $LINE | awk '{print }'`
jobOnNodes=`/usr/bin/jobToNode $jobId | xargs`
echo $timeStr" "$jobId" "$jobUser" "$jobOnNodes >> $workDir/tmpRecFile
#20200702, it is needed to find out user process on nodes at this time here
designatedNode=`echo $jobOnNodes | awk '{print $NF}'`
echo $jobOnNodes
echo $designatedNode
ssh $designatedNode sh $workDir/nodeProInfo.sh ##Here code will exit while loop
echo $timeStr" "$jobId" "$jobUser" "$jobOnNodes >> $workDir/$recordFile
done
nodeProInfo.sh的代码如下:
#!/bin/bash
source /etc/profile
workDir=/work/ccse-xiezy/appRecord
hostName=`hostname`
jobInfo=`ps axo user:15,comm | grep -Ev "libstor|UID|ganglia|root|gdm|postfix|USER|rpc|polkitd|dbus|chrony|libstoragemgmt|para-test|ssh|ccse-x|lsf|lsbatch" | tail -n 1`
echo $hostName" "$jobInfo >> $workDir/proRes
现在我运行脚本sh appRecord.sh,是错误的。当 while
中的第一个循环时它将退出[cc@login04 appRecord]$ sh appRecord.sh
r03n56 r04n09 r04n15
r04n15
[cc@login04 appRecord]$
不知道远程ssh节点方法为什么会退出,谁能帮帮我?
更新:
我有另一个脚本 运行ns ok。 jobIdUser 的内容如下:
r01n23 xxx-ser
r92n12 yyn-ser
while 循环是:
cat $workDir/jobIdUser | while read LINE
do
.............
ssh $NODE pkill -u -9 $USER
.............
done
cat $workDir/jobIdUser | while read LINE
do
...
ssh $designatedNode sh $workDir/nodeProInfo.sh ##Here code will exit while loop
...
done
ssh
(以及循环内的所有其他命令 运行)从 while
循环的标准输入继承其标准输入。默认情况下,ssh
读取其标准
输入并将数据传递给远程进程的标准输入。这意味着 ssh 正在消耗通过管道传输到循环中的数据,从而阻止 while
语句读取它。
您需要防止 ssh 读取其标准输入。您可以通过以下两种方式之一执行此操作。首先,-n
标志阻止 ssh 读取其标准输入:
ssh -n $designatedNode sh $workDir/nodeProInfo.sh
或者您可以从其他来源重定向 ssh 的标准输入:
ssh $designatedNode sh $workDir/nodeProInfo.sh < /dev/null