gpt4 book ai didi

python - ssh 管道损坏时停止 python 程序

转载 作者:IT王子 更新时间:2023-10-29 00:41:23 24 4
gpt4 key购买 nike

我正在编写一个带有无限 while 循环的 python 脚本,我正在通过 ssh 运行它。我希望脚本在有人杀死 ssh 时终止。例如:

脚本(script.py):

while True:
# do something

将运行为:

ssh foo ./script.py

当我终止 ssh 进程时,我希望另一端的脚本停止运行。

我尝试寻找一个封闭的标准输出:

while not sys.stdout.closed:
# do something

但这没有用。

我如何实现这一目标?

编辑:

远程机器是 Mac,在 csh 中打开程序:

502 29352 ??         0:00.01 tcsh -c python test.py
502 29354 ?? 0:00.04 python test.py

我正在从 python 脚本中打开 ssh 进程,如下所示:

p = Popen(['ssh','foo','./script.py'],stdout=PIPE)

while True:
line = p.stdout.readline()
# etc

编辑

建议的解决方案:

  1. 使用 while os.getppid() != 1 运行脚本

这似乎适用于 Linux 系统,但当远程计算机运行 OSX 时不起作用。问题是该命令是在 csh 中启动的(见上文),因此 csh 的父进程 ID 设置为 1,但脚本没有。

  1. 定期登录到stderr

这行得通,但脚本也在本地运行,我不想将检测信号打印到 stderr

  1. 使用 ssh -tt 在伪 tty 中运行脚本。

这确实有效,但会产生一些奇怪的后果。请考虑以下事项:

远程脚本:

#!/usr/bin/env python
import os
import time
import sys

while True:
print time.time()
sys.stdout.flush()
time.sleep(1)

本地脚本:

#!/usr/bin/env python
from subprocess import Popen, PIPE
import time

p = Popen(['ssh','-tt','user@foo','remote_script'],stdout=PIPE)

while True:
line = p.stdout.readline().strip()
if line:
print line
else:
break
time.sleep(10)

首先,输出结果真的很奇怪,好像一直在加tabs什么的:

[user@local ~]$ local_script 
1393608642.7
1393608643.71
1393608644.71
Connection to foo closed.

其次,程序在第一次收到 SIGINT 时不会退出,也就是说,我必须按两次 Ctrl-C 才能终止 local_script。

最佳答案

好的,我有一个解决方案给你

当 ssh 连接关闭时,父进程 ID 将从 ssh-deamon(处理您的连接的分支)的 pid 更改为 1。

因此以下解决了您的问题。

#!/usr/local/bin/python

from time import sleep
import os

#os.getppid() returns parent pid
while (os.getppid() != 1):
sleep(1)
pass

您能否确认这对您也有效:)

编辑

我看到你更新了。

这没有经过测试,但要让这个想法在 OSX 上运行,您可以检测 csh 的进程是否发生变化。下面的代码只是说明了一个想法,并没有经过测试。那就是说我认为它会起作用,但它不是最优雅的解决方案。如果可以找到使用 signals 的跨平台解决方案,那将是首选。

def do_stuff():
sleep(1)

if sys.platform == 'darwin':
tcsh_pid = os.getppid()
sshfork_pid = psutil.Process(tcsh_pid).ppid
while (sshfork_pid == psutil.Process(tcsh_pid).ppid)
do_stuff()

elif sys.platform == 'linux':
while (os.getppid() != 1):
sleep(1)
else:
raise Exception("platform not supported")

sys.exit(1)

关于python - ssh 管道损坏时停止 python 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21731267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com