Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向前运行kubectl端口时发生意外的子进程死亡_Python_Linux_Networking_Kubernetes - Fatal编程技术网

Python 向前运行kubectl端口时发生意外的子进程死亡

Python 向前运行kubectl端口时发生意外的子进程死亡,python,linux,networking,kubernetes,Python,Linux,Networking,Kubernetes,因此,我正在编写一个CLI与Elasticsearch对话(因为我厌倦了长curl命令)。除了我想和运行在Kubernetes内部的集群聊天外,其他一切都非常好,因为它没有在互联网上公开。因此,我必须先手动运行一个kubectl端口forward,我觉得这很烦人 为了“修复”这个问题,我开始实现某种“pre命令”,以便在CLI中的实际命令之前运行。在我的CLI配置文件中,我定义了如下内容: myu集群: 服务器:https://localhost:9200 pre_命令: -命令:“kubect

因此,我正在编写一个CLI与Elasticsearch对话(因为我厌倦了长curl命令)。除了我想和运行在Kubernetes内部的集群聊天外,其他一切都非常好,因为它没有在互联网上公开。因此,我必须先手动运行一个
kubectl端口forward
,我觉得这很烦人

为了“修复”这个问题,我开始实现某种“pre命令”,以便在CLI中的实际命令之前运行。在我的CLI配置文件中,我定义了如下内容:

myu集群:
服务器:https://localhost:9200
pre_命令:
-命令:“kubectl使用上下文…”
等待退出:True
-命令:“kubectl端口前向svc/es 9200”
等待退出:False
等待输出:“从127.0.0.1:9200转发”
此配置意味着在与名为“my_cluster”的集群通信时,我希望事先运行两个shell命令:

  • kubectl使用上下文…
    并等待它退出(因为它不是一个长时间运行的命令)
  • kubectl port forward svc/es 9200
    并等待特定输出:我不想等待此命令退出,因为它不会退出。但是,当端口转发建立时,它会在标准输出上打印一些内容,因此我正在等待
我正在使用来构建命令行,它在名为
prepare\u to\u run\u command
clean\u-up
的方法中公开了一些钩子(已定义):

def_run_shell_子命令(self,command):
command=command.split(“”)
process=subprocess.Popen(命令,stdout=subprocess.PIPE)
返回过程
def prepare_to_run_命令(self,cmd):
对于范围内的i(len(self.context.pre_命令)):
command\u block=self.context.pre\u命令[i]
process=self.\u run\u shell\u子命令(command\u block.get(“command”))
如果命令\u block.get(“等待\u退出”):
进程通信()
elif命令\u block.get(“等待\u输出”):
string_to_look_for=command_block.get(“wait_for_output”)
模式=重新编译(字符串到查找)
尽管如此:
line=process.stdout.readline()
如果不是直线:
打破
行=行解码(“utf-8”).strip()
匹配=重新搜索(图案、线条)
如果匹配为“无”:
通过
其他:
打破
self.context.pre_命令[i][“process”]=process
def清理(自我、指令、结果、错误):
对于self.context.pre_命令中的pre_命令:
pre_命令.get(“进程”).terminate()
它似乎成功地等待了预期的输出,然后继续执行我想要针对Elasticsearch集群运行的实际操作。但问题是:我通常会出现如下错误:

Traceback (most recent call last):
  File "/Users/jeromepin/.asdf/installs/python/3.6.9/lib/python3.6/site-packages/urllib3/connectionpool.py", line 672, in urlopen
    chunked=chunked,
  File "/Users/jeromepin/.asdf/installs/python/3.6.9/lib/python3.6/site-packages/urllib3/connectionpool.py", line 376, in _make_request
    self._validate_conn(conn)
  File "/Users/jeromepin/.asdf/installs/python/3.6.9/lib/python3.6/site-packages/urllib3/connectionpool.py", line 994, in _validate_conn
    conn.connect()
  File "/Users/jeromepin/.asdf/installs/python/3.6.9/lib/python3.6/site-packages/urllib3/connection.py", line 394, in connect
    ssl_context=context,
  File "/Users/jeromepin/.asdf/installs/python/3.6.9/lib/python3.6/site-packages/urllib3/util/ssl_.py", line 370, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/Users/jeromepin/.asdf/installs/python/3.6.9/lib/python3.6/ssl.py", line 407, in wrap_socket
    _context=self, _session=session)
  File "/Users/jeromepin/.asdf/installs/python/3.6.9/lib/python3.6/ssl.py", line 817, in __init__
    self.do_handshake()
  File "/Users/jeromepin/.asdf/installs/python/3.6.9/lib/python3.6/ssl.py", line 1077, in do_handshake
    self._sslobj.do_handshake()
  File "/Users/jeromepin/.asdf/installs/python/3.6.9/lib/python3.6/ssl.py", line 689, in do_handshake
    self._sslobj.do_handshake()
ConnectionResetError: [Errno 54] Connection reset by peer
我的最佳猜测是,端口转发在调用Elasticsearch期间被中断(而它不应该被中断),从而意外终止连接

如果我在另一个shell中手动运行port forward并发出CLI命令(没有任何pre_命令),那么一切都会正常工作


如果这不是运行shell命令的好方法,我也愿意接受建议。

您必须清除每个进程的
stdout
,否则它们将挂起。您确定清除了所有的
标准输出吗?问这个问题是因为我看不到堆栈跟踪与代码相关,也许代码的另一部分中还有其他一些魔法没有得到正确处理,尽管我可能错了。我没有。你是怎么做到的?为什么进程会因此而挂起?想象一下,你负责给一个桶装满水,而你的朋友则负责在桶装满水时将其清空。但是你的朋友从不把它倒空,因为他在去你和你的桶的路上发现了一家糖果店。。您是否应该继续加注水桶,还是关闭水阀,等待水桶释放?:)
.communicate()
应该清空
stdout
(和
stderr
)tho,但问题是它将挂起,直到进程完成,这意味着您的其他进程不会得到它需要的注意。因此,如果您同时运行多个命令,最好使用一个很好的比喻:)但是linux可以处理同时打开的多个文件描述符,对吗?每个进程都有自己的stdout/stderr流,不是吗?不管怎样,我不需要投票和阅读,我只需要关闭它们,对吗?