语境:这是一个非常基本的问题
第一次使用 Putty 和 SSH 进行一些重要的服务器设置并遇到启动了一个我不想停止的进程的情况。
该过程是gunicornWSGI HTTP 服务器(在 Centos 6.3 上运行)。
我用来启动该过程的命令是(根据他们的快速开始):
gunicorn -w 4 myapp:应用程序
在工作会话的这个阶段,我已经失去了命令提示符。这肯定是一个无关紧要的问题,甚至没有进入经验丰富的用户的意识。但不幸的是,以我的经验水平,我留下了几个基本问题:
- 我丢失了命令提示符是否意味着该进程仍在运行?
- 如何在不终止进程的情况下返回命令提示符?
- 我稍后如何回来监控该进程?
- 我最终该如何终止该进程?
任何帮助都将不胜感激,非常感谢!
答案1
你可以使用
nohup gunicorn -w 4 myapp:app &> /dev/null &
这会
- 执行
gunicorn -w 4
- 将进程发送到后台 - 这是
&
最后一步。您可以通过查看后台作业,jobs
并通过将它们带到前台,fg $id
例如,如果它们等待交互 - 通过将标准错误和标准输出重定向到来静音该过程
/dev/null
,因此它不会显示在你的shell中&> /dev/null
- 确保当父进程(这里是你的 shell)结束时该进程不会被终止。
nohup
编辑:
为了监视整个程序,监视程序的输出就足够了。
因此我们可以按照这种方式修改命令:
- 将标准错误输出复制到标准输出流
2>&1
。有关此构造的更多信息,请参见此处:命令行中“2>&1”起什么作用? - 将标准输出流重定向到我们的文件
>~/gunicorn.log
最终的命令如下:
nohup gunicorn -w 4 myapp:app 2>&1 >~/gunicorn.log &
要终止该进程,你可以执行以下一系列命令:
ps aux | grep gunicorn
$PID
然后识别gunicorn 进程的PID(我将其称为)并正常停止它:
kill $PID
或者强行停止:
kill -9 $PID
您可以根据您的进一步需求进行定制。
答案2
我丢失了命令提示符是否意味着该进程仍在运行?
不太可能。该进程将与 ssh 的虚拟终端建立连接,最终将超时并终止与该终端相关的所有进程 - 尽管 gunicorn 可以编写为在控制终端消失时不会退出。
如何在不终止进程的情况下返回命令提示符?
如果终端仍然存在,请按 CTRL+Z 返回到命令提示符,然后写入bg
将 gnuicorn 放置在后台(并使用fg
返回到该进程以便您可以终止它 - 例如使用CTRL+C
)。
以任何一种方式启动它gunicorn -w 4 myapp:app &
都会立即将进程置于 shell 的后台 - 尽管根据服务器的不同,它仍可能在您的 ssh 会话结束时被终止。运行nohup gunicorn -w 4 myapp:app &
将确保即使您断开连接,进程也会运行。阅读手册页nohup
另一个选项是在允许您重新连接的终端中运行该进程。这就是 GNU screen 或 tmux 允许您执行的操作 - 有效地允许您断开 ssh 会话,稍后重新连接并重新连接到现有终端会话。
我稍后如何回来监控该进程?
你不能,除非你在 GNU screen 或 tmux 会话中运行该过程 - 在这种情况下,screen 或 tmux 的文档/教程会告诉你详细信息 - 或者你已经启动服务器作为服务/在后台运行。
我最终该如何终止该进程?
大多数服务器程序都会有一个管理界面(例如您必须运行的命令),您必须在文档中找到相关信息。
或者它们将自身集成到 linux/unix 启动和服务管理程序中,在这种情况下,您可以像管理任何其他服务一样管理它们,例如/sbin/service fooserver start
/sbin/service fooserver stop
在某些 linux 发行版上。
或者您必须手动执行此操作。通过运行ps -ef |grep fooserver
查找其 pid 来找到该进程,然后将其终止kill <the pid>
。或者查看文档,看看服务器是否可以在启动时写入“pid 文件”,以便您稍后可以在该文件中找到进程 id。
现在,似乎 gunicorn 至少有一个 -D 参数,用于将服务器置于后台,将其与终端断开连接,因此当您的 ssh/putty 连接断开时它不会被终止。请参阅http://gunicorn.org/configure.html#server-mechanics
然后,您必须手动管理/监控它,即像我上面提到的那样杀死它,通过它生成的日志文件监控它 - 或者任何集成的监控 web 应用程序或 gnuicorn 可能拥有的命令。
这里的意图显然是让某人为特定的 linux/*nix 变体打包 gnuicorn,并编写相关的脚本和配置文件以将其集成到发行版的本机服务管理中。(例如,/etc/init.d/ 下用于启动和停止服务器的标准脚本,在许多 linux 上使用)
答案3
1)是的,该进程正在运行。
2)您可以通过以下方式在后台启动该进程:
gunicorn -w 4 myapp:app &
3)你可以使用以下命令找到进程 ID(pid)
ps aux | grep gunicorn
4)要终止该进程,你可以使用以下命令终止它
kill (the pid you found in 3)
要强制停止该进程,请运行
kill -9 (the pid you found in 3)