我尝试在一个包含kubectl
的容器中作为后台进程执行一个Python程序,如下所示(kubectl
命令是从本地机器运行的):
kubectl exec -it <container_id> -- bash -c "cd some-dir && (python xxx.py --arg1 abc &)"
当我登录到容器并检查ps -ef
时,我没有看到这个进程正在运行。此外,kubectl
命令本身没有输出。
kubectl
命令是否正确发出?- 有没有更好的方法来达到同样的效果?
- 如何查看正在运行的后台进程打印的输出/日志?
- 如果我需要在一段时间后停止此后台进程,最好的方法是什么?
2条答案
按热度按时间7xllpg7q1#
nohup维基百科页面可以提供帮助;您需要重定向所有三个IO流(stdout,stdin和stderr)-以
yes
为例:在上面的例子中不需要
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可能是一个更好的选择。
u7up0aaq2#
实际上,实现这类事情的最好方法是向容器添加一个入口点,并在那里运行执行命令。比如:
entrypoint.sh
:您不需要手动进入每个容器并运行命令。