linux tools

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 ~]#
上一篇 下一篇

猜你喜欢

热点阅读