nohup 和 & 用法和区别

前言:

linux 跑代码如果不使用守护进程,那么就需要经常跟 nohup 和 &打交道,其实如果不打算深究的话,两个一起用时绝对保险的。

1.知识普及

通过 shell 连接一台 linux 服务器后,
ctrl + c 是发送 SIGINT 信号
关闭 shell 连接发送 SIGHUP 信号

2. & 作用

& 意思是在后台运行,不能免疫 SIGHUP 信号
举个栗子:
test.py

import time

def circle():
    a = 0
    while True:
        a = a+1
        time.sleep(1)

if __name__=='__main__':
    circle()
    

后台启动脚本

python test.py &

启动返回一个进程号,我们查看一下状态

ps -aux|grep test

可以看到进程活着
在这里插入图片描述
然后我们把 shell 连接关了再连接,查看一下进程,发现已经没了
在这里插入图片描述
总结: & 后台运行要一直保持和服务器的连接,连接断开,进程自动死亡

3. nohup 作用

同样的代码,然后启动一下 nohup 脚本

nohup test.py

然后会进入运行状态,如下图,此时会在当前目录产生一个 nohup.out 的文件用于记录代码的各种打印输出(如果代码有输出的话)
在这里插入图片描述
这时候你开一个新的 shell 连接,ps -aux|grep test 是可以查看到进程的
在这里插入图片描述
然后你直接关闭 nuhup 启动脚本的那个shell 连接,你再查看一下进程,发现进程还在;但是,如果你 nohup 启动脚本以后再用 ctrl + c 方式退出,进程就会直接结束。

总结:nohup 可以保持代码一直运行下去直到接受到 SIGINT (即 ctrl + c)信号。

4.联合使用

一般启动代码也都是 nohup 和 & 一起使用,例如

nohup python test.py >run.log 2>&1 &
 >run.log 2>&1 标准输出和标准错误都重定向到当前目录下run.log文件

这样启动代码就可以避免不受 SIGINT 和 SIGHUP 信号的影响。

扫描二维码关注公众号,回复: 8862147 查看本文章

5.后续

天有不测风云,即使 nohup + & 启动代码,代码有时候还会莫名死掉,这一般都会涉及到系统层面,内存等资源的消耗会让系统觉得过了,然后系统会把这个代码直接干掉。为了以防万一,重要的代码还是需要加进程守护,可以在代码里面写(稍复杂),也可以用进程守护工具,常用工具推荐:supervisor (python写的),pm2(node写的)

发布了76 篇原创文章 · 获赞 46 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qingquanyingyue/article/details/103969836
今日推荐