如何从我的Python脚本返回控制权给调用的bash脚本?

2 投票
3 回答
1801 浏览
提问于 2025-04-17 03:35

我正在使用一个bash脚本来循环读取一个配置文件,然后根据这个文件通过ssh调用一个python脚本。不幸的是,一旦这个Python脚本完成工作并且我调用了quit,bash脚本也会被关闭,这样就导致调用的bash脚本的循环提前结束了。

这是我的Bash脚本

target |  grep 'srv:'  | while read l ; do srv $l $SSH ; done

 srv () {
 SSH=$2
 SRV=`echo $1 | awk -F: '{print $2}'`
 STATUS=`echo $1 | awk -F: '{print $3}'`
 open $SSH "srv" $SRV $STATUS
 }

然后在远程机器上调用python脚本的地方

if __name__== "main":
   redirect('./Server.log', 'false')
   conn()
   if sys.argv[1] == "srv":
     ServerState(sys.argv[2], sys.argv[3])
   quit()

所以看起来quit()也在中断这个脚本。

3 个回答

-1

你只需要在主函数中简单地返回就可以了。

0

看起来 quit() 是让你的程序停止运行的那个函数。

如果你能把 quit() 这一行去掉(也就是说它没有什么作用),那就直接去掉它吧。

否则,你可以手动运行你的 Python 程序(不要通过脚本运行),看看会发生什么:很可能是你的 Python 脚本出现了错误,这导致了脚本停止。通过在远程机器上用真实的参数手动运行你的 Python 程序,你应该能找到问题所在。

1

远程的Python脚本做的任何事情都不应该影响你的do循环,除非你在本地的bash中先执行了set -e,这样它就会对命令失败变得敏感。也就是说,只有在你的远程脚本出现异常并返回一个非零的错误值给SSH时,do循环才会停止,这样本地也会出现一个非零的错误代码。

如果你把do srv换成do echo srv,这样你就只是打印出你认为正在运行的命令。你会看到几个srv命令行被打印出来吗?它们的参数是你预期的那些吗?

哦,对了,为什么你每次运行命令都要用open来分配一个新的Linux虚拟终端?这样不会导致虚拟终端用完吗?

撰写回答