【问题标题】:Unable to get the proper exit value of a python script, being run on a remote machine无法获得 Python 脚本的正确退出值,正在远程机器上运行
【发布时间】:2019-12-23 01:18:24
【问题描述】:

我是编程新手。请善待。 :) 我正在尝试从本地机器上的 shell 脚本调用远程机器上的 python 脚本。

我知道我们可以退出值范围为 0 到 127 的 python 脚本。我试图退出值为 3 的 python 脚本。我通过打印验证,我看到退出值在遥控器上是正确的机器。 但是在我的本地机器上,我总是看到远程脚本的退出值为 0。

这是我在本地机器上的 shell 脚本。

sshpass -p password ssh -o StrictHostKeyChecking=no root@10.10.10.10 << EOF
cd /root/drm/myDir
./bla.py
echo $?

这是我在远程机器上的 python 脚本:

import os
import sys
for curr_tc in range(1,10):
    cmd = '..........'
    os.system(cmd)
:
:
:
:
    if 'PASSED' in lineList[-5]:
        continue
    else:
        exit(curr_tc)
exit(0)

请指出我的错误。提前致谢。

【问题讨论】:

  • 你在本地机器上做什么来捕获退出代码?
  • 我只是用 $ 打印?我每次都看到“0”。

标签: python bash shell sh


【解决方案1】:

这个失败的原因是$?在客户端展开了。

解决此问题的最佳方法是根本不检查服务器端的值,而是让它传播到客户端:

sshpass -p password ssh -o StrictHostKeyChecking=no root@10.10.10.10 << EOF
  cd /root/drm/myDir
  ./bla.py
EOF
echo "SSH relayed the exit code, look: $?"

这允许它使用所有形式的if 语句、set -e 或其他检查客户端退出代码的方式。

另一种方法是通过引用此处的文档来确保 $? 被转义:

sshpass -p password ssh -o StrictHostKeyChecking=no root@10.10.10.10 << "EOF"
  cd /root/drm/myDir
  ./bla.py
  echo "The command exited with $?"
EOF
echo "SSH relayed the exit code of echo itself, check it out: $?"

这将正确打印退出代码,但 ssh 本身将始终将其视为成功,因为最后一个命令 echo 成功打印了内容。

【讨论】:

  • 感谢您的帮助。它有帮助
【解决方案2】:

你可以在不使用 EOF 的情况下重写:

result=$(sshpass -p password ssh -o StrictHostKeyChecking=no root@10.10.10.10 'cd /root/drm/myDir;./bla.py;echo $?')
echo $result

这将运行主机上的所有命令,包括 $? 的扩展。使用 EOF 事物时,扩展发生在您的本地计算机上,如 that other guy 所述。用一个简单的 bash 脚本在我的机器上进行了测试,该脚本刚刚运行 exit 3 并且它有效。

然后您可以使用这样的简单 if 语句来比较结果:

if [ $result -eq 3 ]; then
   echo "The process completed successfully."
else
   echo "Process returned unexpected return code $result."
   # Do whatever you need to if this happens.
fi

【讨论】:

  • 感谢您的帮助。它有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-24
  • 1970-01-01
  • 2014-04-14
相关资源
最近更新 更多