当标准输出没有输出时如何杀死 plink.exe? [复制]

Posted

技术标签:

【中文标题】当标准输出没有输出时如何杀死 plink.exe? [复制]【英文标题】:How to kill plink.exe when there's no output from stdout? [duplicate] 【发布时间】:2018-06-27 01:35:29 【问题描述】:

进程完成后,Plink.exe 不会关闭。代码在尝试通过检查 if output == ' ': break 来中断 while 循环时卡住了,但仍然没有运气。我可以打印实时输出,但完成后无法中断循环。

#Establish ssh connection to a server
def _establish_connection(self):
    connection='plink -ssh @ -pw '.format(self.user,self.server,self.pw)
    self.sp = Popen(connection,stdin=PIPE,stdout=PIPE) 



#Trying to read live output from stdout and write to file
def _test_create_log(self,_system,_logdir):
     self._establish_connection()
     self.sp.stdin.write(_command)
     timestr = time.strftime("%Y%m%d-%H%M%S")
     dir_to_log = os.path.join(_logdir,_system + '_' + timestr + '.txt')
     with open(dir_to_log,'w+') as myLog:
         while True:
             output = self.sp.stdout.readline()
             output.decode('ASCII')
             if output != '': 
                 myLog.write(output)
                 print(output.strip())
             else: #Code does not reach here, plink not killed.
                 self.sp.kill()
                 break

【问题讨论】:

【参考方案1】:

Shell 是一个带有输入和输出的黑盒子。无法检测到某个特定命令的输出是否已结束。您所能做的就是在输出的末尾添加一些魔术字符串并寻找它。无论如何,这不是正确的解决方案。


如果您希望 Plink 使用该命令关闭,请在 Plink 命令行中提供该命令,例如:

connection='plink -ssh @ -pw  '.format(self.user,self.server,self.pw,_command)

虽然更好的方法是在 Python 中使用原生 SSH 库,例如 Paramiko,而不是驱动外部控制台应用程序。

见python paramiko run command。

【讨论】:

以上是关于当标准输出没有输出时如何杀死 plink.exe? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当父母和孩子都写入标准输出时,输出中没有交错

从 Windows 上的 plink.exe 在 Linux 上执行 sudo 命令

如何杀死正在运行的SELECT语句

如何在从我产生的工作中获取一行标准输出时阻止 bash

如何使用 googletest 捕获标准输出/标准错误?

如何标准化 BERT 分类器的输出