与kubectl exec运行后台进程

时间:2018-03-12 21:47:14

标签: python linux kubernetes background-process

我正在尝试将python程序作为后台进程在具有kubectl的容器内执行(如本地机器上发布的kubectl):

kubectl exec -it - bash -c“cd some-dir&&(python xxx.py --arg1 abc&)”

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

kubectl命令是否正确发出?

有没有更好的方法来实现同样的目标?

如何查看正在运行的后台进程的输出/日志?

如果我需要在一段时间后停止此后台处理,那么最好的方法是什么?

由于

2 个答案:

答案 0 :(得分:0)

实际上,制作此类内容的最佳方法是在容器中添加一个入口点并运行其中的命令。 像:

entrypoint.sh

#!/bin/bash
set -e

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

exec "$@"

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

答案 1 :(得分:0)

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

kubectl exec pod -- bash -c "yes > /dev/null 2> /dev/null &" 
在上述情况下不需要

nohup因为我没有分配伪终端(没有-t标志)而且shell没有交互(没有-i标志)所以没有{在会话终止时,{1}}信号被发送到HUP进程。有关详细信息,请参阅this答案。

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

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

要停止该过程,您需要识别要停止的进程的PID(pgrep可能对此有用)并向其发送致命信号(例如ls -l /proc/YES_PID/fd )。

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