Linux 技巧:让进程在后台运行的几种方法
2019-07-24 本文已影响84人
我的袜子都是洞
我们经常会碰到这样的问题,用 telnet/ssh 登录了远程的 Linux 服务器,运行了一些耗时较长的任务, 结果却由于网络的不稳定导致任务中途失败。如何让命令提交后不受本地关闭终端窗口/网络断开连接的干扰呢?下面举了一些例子, 您可以针对不同的场景选择不同的方式来处理这个问题。
nohup
网上的许多文章对于nohup这个命令有非常细致的讲解,然而我认为在使用阶段最好的就是能快速易懂方便使用,如果有需求深入学习的话,再查阅相关的文档,起码不要再学习整个命令的初期把人讲晕了。
# 1.后台启动程序
nohup Command [ Arg … ] [ & ]
# nohup命令 参数可选但不是必须的,又需要看文档既可
# 举例
# 在后台运行 test.py的python脚本
nohup python test.py &
# 在后台运行uwsgi(下面的只是uwsgi举例)
nohup uwsgi --http :8001 --wsgi-file test.py &
# 执行之后会返回一个进程号
# 以及告诉你程序的标准输出都会保存在一个叫outhup.out的文件中在程序根目录下
# 2.查看此程序运行状态
# 端口状态查看
lsof -i:port
# 某某程序运行状态
ps -ef | grep <程序名>
# 举例
# 查看后台python运行状态
ps -ef | grep python
# 查看后台uwsgi运行状态
ps -ef | grep uwsgi
# jobs这个命令也可查看程序后台运行状态,不过另起一个ssh就出不来了,感觉有点鸡肋
# 3.停掉这个程序,不让他运行了
# 可以把后台程序转到前台,也可以根据进程号直接干掉,这里推荐后者,毕竟方便
# 例如根据 ps -ef | grep <程序名> 得到进程号24365
kill 24365
# 这个进程讲就game over了
# 最最最重要的一点
# 程序在后台运行了之后,不要直接把ssh给关了
# 一但ssh客户端中断,这个进程也就直接挂了
# 所以我们需要exit来退出远程连接,真的是细节决定成败
setsid
nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP 信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。
setsid 示例
[root@pvcent107 ~]# setsid ping www.ibm.com
[root@pvcent107 ~]# ps -ef |grep www.ibm.com
root 31094 1 0 07:28 ? 00:00:00 ping www.ibm.com
root 31102 29217 0 07:29 pts/4 00:00:00 grep www.ibm.com
[root@pvcent107 ~]#
&
这里还有一个关于 subshell 的小技巧。我们知道,将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,从而扩展出很多有趣的功能,我们现在要讨论的就是其中之一。
当我们将"&
"也放入“()
”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。
示例:
[root@pvcent107 ~]# (ping www.ibm.com &)
[root@pvcent107 ~]# ps -ef |grep www.ibm.com
root 16270 1 0 14:13 pts/4 00:00:00 ping www.ibm.com
root 16278 15362 0 14:13 pts/4 00:00:00 grep www.ibm.com
[root@pvcent107 ~]#