kubernetes 如何使用kubectl exec在容器上运行后台进程?

ux6nzvsh  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(2)|浏览(192)

我尝试在一个包含kubectl的容器中作为后台进程执行一个Python程序,如下所示(kubectl命令是从本地机器运行的):

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

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

  • kubectl命令是否正确发出?
  • 有没有更好的方法来达到同样的效果?
  • 如何查看正在运行的后台进程打印的输出/日志?
  • 如果我需要在一段时间后停止此后台进程,最好的方法是什么?
7xllpg7q

7xllpg7q1#

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

kubectl exec pod -- bash -c "yes > /dev/null 2> /dev/null &"

在上面的例子中不需要nohup,因为我没有分配一个伪终端(没有-t标志),并且shell不是交互式的(没有-i标志),所以在会话终止时没有HUP信号发送到yes进程。有关详细信息,请参阅此答案。
在上述情况下,不需要将/dev/null重定向到stdin,因为stdin已经引用了/dev/null(您可以通过在另一个shell中运行ls -l /proc/YES_PID/fd来看到这一点)。
要查看输出,您可以将stdout重定向到文件。
要停止进程,您需要标识要停止的进程的PID(pgrep可能对此很有用),并向其发送致命信号(例如kill PID)。
如果你想在一段固定的时间后停止进程,timeout可能是一个更好的选择。

u7up0aaq

u7up0aaq2#

实际上,实现这类事情的最好方法是向容器添加一个入口点,并在那里运行执行命令。比如:
entrypoint.sh

#!/bin/bash
set -e

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

exec "$@"

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

相关问题