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
  1. $ ls >outfile
  2. $ cat outlog
  3. outlog
  4. test.sh
  5. $ ls xxx>outfile
  6. ls: cannot access xxx: No such file or directory
  7. $ cat outfile
  8. (这里是空)
  9. $ ls xxx 2>1
  10. $ cat 1(可以看出,将错误信息重定向到文件1里面了)
  11. 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. Cheat Engine 修改汇编指令

    打开游戏 扫描阳光 扫描过程就不讲了 找到阳光的地址 显示反汇编 找到使阳光减少的反汇编代码 空指令替换 将阳光减少汇编指令,用空指令替换.这样阳光就不再减少了 指令替换 也可以将汇编指令修改,减少变 ...

  2. YUV视频格式详解(翻译自微软文档)

    原文: https://docs.microsoft.com/en-us/previous-versions/aa904813(v=vs.80) YUV视频格式详解(翻译自微软文档)https://b ...

  3. PHP的SPL标准库

    1,简介 SPL,全称 Standard PHP Library 中文是 标准PHP类库.是php内置的一些拓展类和拓展接口,其内容包含数据结构.迭代器.接口.异常.SPL函数,文件处理等内容.SPL ...

  4. Python内置函数复习

    filter sorted heapq counter namedtuple  reduce deque pickle islice re.split endswith stat os #filter ...

  5. Django 之restfromwork 序列化组件实现数据增删查改

    rest-framework序列化之Serializer models.py from django.db import models # Create your models here. class ...

  6. zabbix--监控MySQL主从状态

    zabbix监控MySQL主从状态 搭建MySQL主从后,很多时候不知道从的状态是否ok,有时候出现异常不能及时知道,这里通过shell脚本结合zabbix实现监控并告警 一般情况下,在MySQL的从 ...

  7. Netbackup常用命令--bprestore

    bprestore bprestore – 从 NetBackup 服务器还原文件 大纲 bprestore [-A | -B | -rb] [-K] [-l | -H | -y] [-r] [-T] ...

  8. Fiddler无法抓取HTTPS的问题,Fiddler证书无法安装终极解决方案,

    win7下Fiddler证书安装之后,总是无法抓取https的包:网上搜了很多方法都没解决问题,最终摸索解决方法如下: 第一步: 安装证书:到Fiddler的Tools-options-https下, ...

  9. thrift rpc通信

    thrift rpc通信 框架 别人的简历: 负责抓取程序的开发和维护,对抓取内容进行数据提取.整理.1.定向数据抓取程序的维护和开发,了解了Sqlite数据库.Thrift服务和多线程的开发调试.2 ...

  10. mysql-xtrabackup备份恢复

    1.xtrabackup的安装 8.0版本-支持mysql8 wget https://www.percona.com/downloads/Percona-XtraBackup-LATEST/Perc ...