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

若想命令在后台运行,则可用 & 指定命令在后台运行;

若想终端退出后程序不停止运行,则可用nohup命令启动后台程序。

nohup(=no hang up),使命令忽略SIGHUP信号;
[语法] nohup Command [ Arg ... ] [&]
[命令输出说明]

Command 的输出如果没有被重定向,则无论是标准输出(stdout),还是标准错误(stderr),均重定向到nohup.out文件;nohup.out文件缺省写在当前目录下,如果在该目录下无写权限,则试图写到$HOME/nohup.out中,如果仍然失败,整个命令执行失败;

Command的输出如果重定向,则写入指定的重定向文件中;

[退出状态]
126 能查找但不能调用 Command 命令;
127 nohup 命令发生错误或找不到 Command 命令;
否则为 Command 命令的退出状态;

nohup与&的区别:
nohup只是让命令忽略SIGHUP命令而已;

&则让命令在后台运行;

至于该命令是否能在脱离终端后继续执行则要看进程是否是守护进程,如果不是,则需要nohup来帮忙;

PS,引用 http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html

---------以下为引用内容
————————————————

nohup -- invoke a utility immune to hangups : 运行命令忽略挂起信号

& 是指后台运行;

nohup 的功能和& 之间的功能并不相同。其中,nohup 可以使得命令永远运行下去和用户终端没有关系。当我们断开ssh 连接的时候不会影响他的运行。而& 表示后台运行。当ssh 断开连接的时候(用户退出或挂起的时候),命令也自动退出。

当然我们可以把两者结合起来使用:

nohup command &

来实现命令的后台运行并且和用户终端没有关系。

由 nohup 文档来看:

If the output file nohup.out cannot be created in the current directory, the nohup utility uses the directory named by HOME to create the file.

表示:nohup 命令执行后,会产生日志文件,把命令的执行中的消息报损到这个文件之中。如果当前文件不可写,那么会自动保存到执行这个命令的home 目录下面。如果是超级管理员root 对应的是/root 目录。

从上面对比我们发现:

1. & 可以使得命令 免疫 ctrl c 的 SIGINT 信号,不能是的命令对 SIGHUP 信号进行免疫。

2. nohup 可以使得命令对两个信号都可以进行免疫。

为了使得 & 达到相同的效果:

我们可以使用如下操作:

如果已经使用 & 命令进行 后台运行。

可以使用disown -h 让任务忽略sighup 信号;

同样不会因为控制台的终端而中断任务。

展示:

断开终端重新登录时:

这样当你在大量备份文件的时候,如果出现断网或者不得不下线的时候。我们可以使用。

ctrl z 挂起任务;disown-h 使得任务 忽略sighup 信号;使用 bg 命令使得命令后台运行。这样就可以放心得下线了。

参考链接:

1. https://blog.csdn.net/zhang_Red/article/details/52789691

2. https://blog.csdn.net/stpeace/article/details/76389073

1.1 nohup

功能:不挂断运行命令

语法:nohup Command [ Arg … ] [ & ]

​ 无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。

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

  如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

退出状态:该命令返回下列出口值:   

  126: 可以查找但不能调用 Command 参数指定的命令。   

  127: nohup 命令发生错误或不能查找由 Command 参数指定的命令。   

  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

1.2 &

功能:命令在后台运行,功能与Ctrl+z相同,一般配合nohup一起使用

eg:nohup ~/user/test.sh>output.log 2>&1 &

命令详解:

  • nohup ~/user/test.sh>output.log 不挂断运行test.sh,输出结果重定向到当前目录的output.log
  • 最后的& 表示后台运行
  • 2>&1 0表示键盘输入,1屏幕输出即标准输出,2表示错误输出。其中2>&1表示将错误信息重定向到标准输出 试想一下,如果2>&1指将错误信息重定向到标准输出,那2>1指什么? 分别尝试2>12>&1
$ ls >outfile
$ cat outlog
outlog
test.sh
$ ls xxx>outfile
ls: cannot access xxx: No such file or directory
$ cat outfile
(这里是空)
$ ls xxx 2>1
$ cat 1(可以看出,将错误信息重定向到文件1里面了)
ls: cannot access xxx: No such file or directory

​ 也就是说2>1会将错误信息重定向到文件1里面,所以2>&1中的&1指标准输出

2. 查看后台运行的进程

2.1 jobs的使用

jobs命令用于显示Linux中的任务列表及任务状态,包括后台运行的任务。该命令可以显示任务号及其对应的进程号。其中,任务号是以普通用户的角度进行的,而进程号则是从系统管理员的角度来看的。一个任务可以对应于一个或者多个进程号。

语法: jobs(选项)(参数)

选项

-l:显示进程号; -p:仅任务对应的显示进程号; -n:显示任务状态的变化; -r:仅输出运行状态(running)的任务; -s:仅输出停止状态(stoped)的任务。

常用命令: jobs -l

其中,输出信息的第一列表示任务编号,第二列表示任务所对应的进程号,第三列表示任务的运行状态,第四列表示启动任务的命令。

缺点:jobs命令只看当前终端生效的,关闭终端后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)

2.2 ps的使用

ps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。

常用命令:ps -aux

a:显示所有程序 u:以用户为主的格式来显示 x:显示所有程序,不以终端机来区分

通常与nohup &配合使用,用于查看后台进程ID 配合 kill命令杀掉程序

常用命令:ps -aux|grep test.sh| grep -v grep

注:grep -v grep 用grep -v参数可以将grep命令排除掉

https://www.cnblogs.com/laoyeye/p/9346330.html

linux中nohup 与 & 的区别的更多相关文章

  1. Linux中终端和控制台区别

    Linux中终端和控制台区别: 终端:英文名叫terminal 控制台:英文名叫console 两者区别要从以前的多人使用的计算机开始 以前,由于计算机很昂贵,所用一台计算机一般由多个人同时使用.这样 ...

  2. Linux中nohup和&的用法和区别

    在Linux执行任务时,如果键入Ctrl+C退出进行其他任务或者关闭当前session 当前任务就会终止 要想不让进程停止或者让进程在后台运行,就需要一些命令,nohup和&就是一种非常好的方 ...

  3. Linux中ctrl-c, ctrl-z, ctrl-d 区别

    在Linux中: ctrl-c: ( kill foreground process )   发送 SIGINT 信号给前台进程组中的所有进程,强制终止程序的执行: ctrl-z: ( suspend ...

  4. linux 中的斜杠 ‘/’ ‘\’ 的区别 - 服务器是LINUX的注意了, 和windows 的不一样哦!

    ubuntu@ubuntu:~$ vi \> ubuntu@ubuntu:~$ 稍微思考了一下就明白了,不是打不开,问题出在这个文件名" \ "上面. 反斜线符号" ...

  5. Linux中su和su -区别,别再傻傻分不清

    写在前面 如果你不清楚su和su -切换用户的区别,你一定会遇到在使用su切换用户执行命令出现报错"command not found"感到惊讶.分明之前这个指令执行的好好的,为什 ...

  6. 【Linux】nohup和&的区别

    同样都是后台执行进程,但是nohup和&有什么区别呢? & 是指后台运行: nohup 的功能和& 之间的功能并不相同. 其中,nohup 可以使得命令永远运行下去和用户终端没 ...

  7. linux中 ll 和ls 区别

    ll 列出来的结果详细,有时间,是否可读写等信息 ,象windows里的 详细信息ls 只列出文件名或目录名 就象windows里的  列表 ll -t 是降序,  ll -t | tac 是升序 l ...

  8. 关于Linux中nohup.out日志过大问题

    背景,java项目,一般在运行JAVA程序时需要用到nohup命令来实现后台启动日志,默认保存在当前目露nohup.out文件.但是有些程序输出nohup文件会出现过大的情况. 在此解决如下: 1,在 ...

  9. linux中yum与rpm区别

    一.源代码形式 1.      绝大多数开源软件都是直接以原码形式发布的 2.      源代码一般会被打成.tar.gz的归档压缩文件 3.      源代码需要编译成为二进制形式之后才能够运行使用 ...

随机推荐

  1. Shell 选择排序

    举例 #!/bin/bash echo "please input a number list:" read -a arrs for((i=0;i<${#arrs[@]};i ...

  2. 虚拟机安装mysql踩坑记录

    本章节主要讲解的是在虚拟机centOs7版本以上安装mysql5.6版本,亲测可以直接使用,有需要帮助的小伙伴可以加本人QQ2246451792@qq.com!!!! 卸载centOs7自带的mari ...

  3. 百度地图公交线路查询,并绘制到地图上并获取所有路径经纬度点(可供echarts 路径图使用)

    github地址 https://github.com/a1115040996/MyHTML/tree/gh-pages/BDMap 源代码 <!DOCTYPE html PUBLIC &quo ...

  4. 浅谈Python设计模式 - 工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 工厂模式: 顾名思义,工厂则是根据提供的不同的材料,生产出不同的产品.那么在编程 ...

  5. filter - date 日期插件

    为什么要用date插件: 我们希望日志展示的时间就是日志生成的时间,一般日志中都会附加时间,这样方便根据时间查找问题.但在logstash中,默认使用@timestamp时间值来表示日志的时间,@ti ...

  6. 类型转换的时候,.valueOf()和.parseX(),.Xvalue()的区别

    .valueOf()返回的是包装类(Wrapper Class)中的一些类型:而.parseX()返回的是基本数据类型,如int,char,double等.其参数应该是String类型. .Xvalu ...

  7. package的xml格式的改变

    package.xml文件格式由1到2发生了一些变化: 格式2有如下一行: <package format="2"> 依赖也发生一些变化<depend> 格 ...

  8. 【VUE】图片预览放大缩小插件

    From: https://www.jianshu.com/p/e3350aa1b0d0 在看项目时,突然看到预览图片的弹窗,感觉好僵硬,不能放大,不能切换,于是便在网上找下关于图片预览的插件,有找到 ...

  9. MVC 自己创建URL 对象处理路径

    var url = new UrlHelper(filterContext.RequestContext); var url = new UrlHelper(HttpContext.Current.R ...

  10. (2)在树莓派安装运行在Python3上的OpenCV

    https://www.jianshu.com/p/56929416b4a1 http://www.eeworld.com.cn/afdz/article_2018030511619.html htt ...