在Linux执行任务时,如果键入Ctrl+C退出进行其他任务或者关闭当前session

当前任务就会终止 要想不让进程停止或者让进程在后台运行,就需要一些命令,nohup和&就是一种非常好的方式

首先以执行一个python脚本为例:

python test.py

nohup&的区别

&:后台运行,但当用户退出(挂起)的时候,命令自动也跟着退出

什么意思呢? 意思是说, 当你在执行 python test.py & 的时候, 即使你用ctrl C, 那么python test.py照样运行(因为对SIGINT信号免疫)。 但是要注意, 如果你直接关掉shell后, 那么, 这个python进程同样消失。 可见, &的后台并不硬(因为对SIGHUP信号不免疫)。

nohup: 即no hang up,不挂断的运行

nohup的意思是忽略SIGHUP信号, 所以当运行nohup python test.py的时候, 关闭shell, 那么这个python进程还是存在的(对SIGHUP信号免疫)。 但是, 要注意, 如果你直接在shell中用Ctrl C, 那么, 这个python进程也是会消失的(因为对SIGINT信号不免疫)

注意并没有后台运行的功能,就是指,用nohup运行命令可以使命令永久的执行下去,和用户终端没有关系,例如我们断开SSH连接都不会影响他的运行,注意了nohup没有后台运行的意思;&才是后台运行

综合使用

如果想让进程在后台不挂断的运行,需要nohup&结合起来使用

nohup nohup python test.py &> /var/log/python.log &

nohup语法:

nohup Command [ Arg ... ] [ & ]

nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。

如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

实战讲解

首先准备一个python测试代码,是一个输出HelloWorld和数字的死循环脚本,每输出一行就等待1秒:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import time var = 1
while var > 0 : # 该条件永远为true,循环将无限执行下去 print "HelloWorld: ", var
var = var +1
time.sleep(1) #每输出一行就休眠1秒

1. 前台运行

执行下列命令前台运行python脚本是什么情况呢?

python test.py

程序每隔一秒会在终端输出一个字符串。

此时如果键入Ctrl+C ,程序会收到一个SIGINT信号,如果不做特殊处理,程序的默认行为是终止(如上图)。

2. 后台运行

执行下面的命令在后台运行这个python脚本:

python test.py &

如上图,首先会在终端显示进程号是8778

如果键入Ctrl + C,发出SIGINT信号,程序会继续运行吗?

下图所示,键入Ctrl + C程序仍然会继续运行:

执行ps -ef|grep test.py查询一下,程序进程确实存在,如下图所示:

此时如果关闭session即关闭xshell,程序会收到一个SIGHUP信号,此时会怎么样呢?

重新打开xshell的session,:

如上图,程序不会继续输出,而且执行ps -ef|grep test.py刚刚打开的进程以及被关闭了。

3. 使用nohup运行脚本

如果使用nohup命令来运行python脚本的话,会是怎样的情况呢?

执行以下命令:

nohup python test.py

如上图,使用nohup 运行程序test.py,会发现:

  • 前台没有出现进程号
  • 有一个“忽略输入,输出至nohup.out”的提示
  • hello的输出也没有出现在前台

如上图,在另一个xshell的session的窗口执行ps -ef|grep test.py,会发现脚本已经在运行了,进程号是20085

在前一个图中提示输出至nohup.out的提示,那么我们在新打开的窗口去看看这里面是啥。

vi nohup.out

如上图,脚本的日志会在这个文件输出。

此时,如果我们关闭原来执行脚本的xshell的session,程序会收到一个SIGHUP信号,程序会不会关闭呢?

如上图,我们在新打开的xshell创建执行ps -ef | grep test.py发现,这个PID为20085的python进程还存在

此时只能通过kill命令来杀死进程了:

kill -9 20085

然后,再次ps一下,如下图,进程已经被杀掉了

此时重新使用nohup执行一下这个python脚本:nohup python test.py

然后键入Ctrl+C,并且执行ps -ef | grep test.py查看一下进程:

如上图所示,键入Ctrl+C后,程序收到SIGINT信号后,进程直接关闭了

4. 后台不挂断运行

nohup&一起使用,我们来看看是什么情况:

使用以下指令运行程序:

nohup python test.py &

如上图,使用nohup python test.py &运行程序后,可以看到:

  • 会在终端显示进程号是21503
  • 也会有一个“忽略输入,输出至nohup.out”的提示
  • 键入Ctrl + C,发送SIGINT信号,似乎没反应。

关闭session,发送SIGHUP信号,再打开一个session窗口ps一下:

如上图,ID为21503的进程依然存在,后续也只能用kill来关闭它。

结论

使用&后台运行程序:

  • 结果会输出到终端
  • 使用Ctrl + C发送SIGINT信号,程序免疫
  • 关闭session发送SIGHUP信号,程序关闭

使用nohup运行程序:

  • 结果默认会输出到nohup.out
  • 使用Ctrl + C发送SIGINT信号,程序关闭
  • 关闭session发送SIGHUP信号,程序免疫

使用nohup和&配合来启动程序:

  • 同时免疫SIGINT和SIGHUP信号

最佳实践方案:

不要将信息输出到终端标准输出,标准错误输出,而要用日志组件将信息记录到日志里

nohup命令可以将日志输入到文件中

  • 如果不指定输出文件,默认输出到当前目录下的nohup.out文件
  • 如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

举个例子:

nohup python test.py > test.log 2>&1 &
nohup ping www.baidu.com > ping.log 2>&1 &

Linux输出重定向:

https://blog.csdn.net/liucy007/article/details/90207830

Linux中nohup和&的用法和区别的更多相关文章

  1. Linux中yum和apt-get用法及区别

    Linux中yum和apt-get用法及区别   一般来说著名的linux系统基本上分两大类:   1.RedHat系列:Redhat.Centos.Fedora等   2.Debian系列:Debi ...

  2. JS中的== 、===的用法和区别。

    JS中的== .===的用法和区别.[转] == 和 != 比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果 . 而  === 和 !== 只有在相同类型下,才会比较其值 ======= ...

  3. linux中fork, source和exec的区别

    转:linux中fork, source和exec的区别 shell的命令可以分为内部命令和外部命令. 内部命令是由特殊的文件格式.def实现的,如cd,ls等.而外部命令是通过系统调用或独立程序实现 ...

  4. linux中nohup 与 & 的区别

    Linux/Unix下,通常只有守护进程可在脱离终端的情况下能继续执行,而普通进程在关闭终端时会因收到SIGHUP信号(挂起信号)而退出.当终端退出后,由该终端启动的后台程序自动退出. 若想命令在后台 ...

  5. linux中软链接和硬链接的区别与小结

    ln命令 该命令在文件之间创建链接.这种操作实际上是给系统中已有的某个文件指定另外一个可用于访问它的名称.对于这个新的文件名,我们可以为之指定不同的访问权限,以控制对信息的共享和安全性的问题. 如果链 ...

  6. linux中软连接和硬链接的区别

    linux中创建软连接和硬链接的方法: 软连接: ln -s oldfile slink 硬连接: ln oldfile hlink linux中创建软连接和硬链接的区别:        原理上,硬链 ...

  7. linux中/etc/profile 和 ~/.bash_profile 的区别

    在 linux中设置环境变量一般使用bash_profile进行配置 其中/etc/bash_profile 表示系统整体设置 ,生效后系统内所有用户可用而 ~/.bash_profile 只表示当前 ...

  8. Linux中apt与apt-get命令的区别与解释

    2019-01-15 14:35:39 随着 apt install package 命令的使用频率和普遍性逐步超过 apt-get install package,越来越多的其它 Linux 发行版 ...

  9. linux中shell命令test用法和举例

    shell test命令 和 [ 是同一个命令的不同名称. 原文:http://www.cnblogs.com/Jeff-Tang/p/5776947.html ------------------- ...

随机推荐

  1. python_json模块和pickle模块

    json 优点:所有语言通用:缺点:只能序列化基本的数据类型list/dict/int... json格式中,字符串必须是双引号,字符都是小写. 序列化: import json v = [12,3, ...

  2. oracle 12c 安装补丁报错

    环境: centos 7.5 oracle 12.2.0.1 报错: 执行一下报错: 更新dba_registry_sqlpatch $ORACLE_HOME/OPatch/datapatch -ve ...

  3. Java集合--Map总结

    转载请注明出处:http://www.cnblogs.com/skywang12345/admin/EditPosts.aspx?postid=3311126 第1部分 Map概括 (01) Map ...

  4. CSS实现宽度自适应100%,宽高16:9的比例的圖片或者矩形

    前言 图片的大小是多少,宽度一定,高度要始终自自适应为16:9. 解决 1通过js,程序算出绝对高度再进行设置.这是解决问题最容易想到的方法. 2.我们的原则是能用css实现的功能尽量用css,这有利 ...

  5. map填充bean赋值,包括父类全部填充。

    有不少工具类给bean填充值.但是填充,很多都是只能填充到当前类的对象.经过需求修改,做了个工具类: import java.lang.reflect.Field; import java.lang. ...

  6. [Codevs] 矩形面积求并

    http://codevs.cn/problem/3044/ 线段树扫描线矩形面积求并 基本思路就是将每个矩形的长(平行于x轴的边)投影到线段树上 下边+1,上边-1: 然后根据线段树的权值和与相邻两 ...

  7. Noip2011 提高组 选择客栈

    P1311 选择客栈 直通 思路: ①看题,我们可以发现一个显然的性质,即当最左边的客栈向右移动时,最右边的客栈时单调向右的,并且右端点往右的客栈也符合要求.(因为只要左侧有一个满足的,右边的自然可以 ...

  8. Win10配置Java环境变量

    很多同学在学习Java入门的时候被Java环境变量搞的一头雾水,今天这篇文章拓薪教育就来说一下如何在win10下配置环境变量; 下载jdk安装包: 首先我们需要下载jdk的安装包,这里提供jdk的安装 ...

  9. 7.26T3小游戏

    小游戏 题目描述 有一个简单的小游戏.游戏的主人公是一个勇士,他要穿过一片黑森林,去 解救公主.黑森林的地图可以用一张 V 个点.E 条边的无向图来描述,起点是 1 号点,终点是 V 号点.勇士从起点 ...

  10. 前端逼死强迫症之css续集

    上节内容回顾 如果点击图片调转到连接,a标签下套img标签,在IE有的版本中,会有蓝色边框. 因为a标签默认字体颜色就是蓝色,img标签继承了父级标签,而IE浏览器默认给边框加了宽度.解决: < ...