使用 kubectl exec 运行后台进程

use*_*281 6 python linux background-process kubernetes

我正在尝试在容器内执行一个 Python 程序作为后台进程kubectl,如下所示(kubectl在本地机器上发布):

kubectl exec -it <container_id> -- bash -c "cd some-dir && (python xxx.py --arg1 abc &)"

当我登录到容器并检查时,ps -ef我没有看到这个进程在运行。此外,kubectl命令本身没有输出。

  • kubectl命令正确执行?
  • 有没有更好的方法来实现相同的目标?
  • 如何查看正在运行的后台进程打印的输出/日志?
  • 如果我需要在一段时间后停止这个后台进程,最好的方法是什么?

dip*_*ark 14

nohup维基百科页面可以提供帮助;您需要重定向所有三个 IO 流(stdout、stdin 和 stderr) - 示例如下yes

kubectl exec pod -- bash -c "yes > /dev/null 2> /dev/null &" 
Run Code Online (Sandbox Code Playgroud)

nohup在上述情况下不需要,因为我没有分配伪终端(无-t标志)并且 shell 不是交互式的(无-i标志),因此在会话终止时不会HUP向进程发送信号yes。有关更多详细信息,请参阅答案。

/dev/null在上述情况下不需要重定向到 stdin,因为 stdin 已经引用了/dev/null(您可以通过ls -l /proc/YES_PID/fd在另一个 shell 中运行来看到这一点)。

要查看输出,您可以将 stdout 重定向到文件。

要停止该进程,您需要识别要停止的进程的 PID(pgrep对于此目的可能很有用)并向其发送致命信号(kill PID例如)。

如果您想在固定持续时间后停止该过程,超时可能是更好的选择。


Idi*_*ine 4

实际上,进行此类操作的最佳方法是向容器添加一个入口点并在那里运行执行命令。喜欢:

entrypoint.sh

#!/bin/bash
set -e

cd some-dir && (python xxx.py --arg1 abc &)
./somethingelse.sh

exec "$@"
Run Code Online (Sandbox Code Playgroud)

您不需要手动进入每个容器并运行命令。

  • Oubhab Meskine 你真的救了我,伙计,不知道如何感谢你,但更多很多很多感谢我被困住了,就像这个 kubectl proxy --port=58080 &amp; &amp;&amp; cd /opt/helm 但你的建议帮助我把这样的大括号 (kubectl proxy --port=58080 &amp;) &amp;&amp; cd /opt/helm 确实有效,欢呼 (2认同)