来源:http://blog.chinaunix.net/uid-446337-id-94446.html

& 方式:

Unix/Linux下一般想让某个程序在后台运行,很多都是使用 & 在程序结尾,来让程序自动在后台运行。
比如我们要运行mysql在后台:

/usr/local/mysql/bin/mysqld_safe --user=mysql &

nohup方式:

nohup 命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用 nohup 命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup 就是不挂起的意思( no hang up)。

nohup 命令 

    用途:不挂断地运行命令。 
	
    该命令的一般形式为:nohup command & 

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

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

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

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

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

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

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

如果使用 nohup 命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为 nohup.out 的文件中,除非另外指定了输出文件: 

nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到 myout.file 文件中。 

        使用 jobs 查看任务。 
        使用 fg %n 关闭。 

nohup 后台运行

nohup command 

或者 

nohup command & 

这之间的差别是带 & 的命令行,即使 terminal(终端)关闭,或者电脑死机程序依然运行。

但是我们很多程序并不象 mysqld 一样可以做成守护进程可能我们的程序只是普通程序而已,一般这种程序即使使用 & 结尾,如果终端关闭,那么程序也会被关闭。为了能够后台运行,我们需要使用 nohup 这个命令,比如我们有个 start.sh 需要在后台运行,并且希望在后台能够一直运行,那么就使用 nohup: 

nohup /root/start.sh &

在shell中回车后提示: [~]$ appending output to nohup.out 
原程序的的标准输出被自动改向到当前目录下的 nohup.out 文件,起到了 log 的作用。

nohup 重定向

nohup 把标准输出(STDOUT)和标准错误(STDERR)结果输出到 nohup.out 文件这个看似很方便,但是当输出很大的时候,nohup.out 文件会非常大,或者多个后台命令的时候大家都会输出到 nohup.out 文件,不利于查找结果和调试程序。 所以能够重定向输出会非常方便。下面要介绍标准输出,标准输入 和标准错误了。

其实我们一直都在用。比如:

>./command.sh > output     # 这其中的 > 就是标准输出符号,其实是 1>output 的缩写 
    >./command.sh 2> output    # 这里的 2> 就是将标准错误输出到 output 文件里。 
                               # 而 0< 则是标准输入了。

下面步入正题,重定向后台命令

>nohup ./command.sh > output 2>&1 &

解释:前面的 nohup 和后面的 & 就不用解释了,主要是中间的 2>&1的意思 ,这个意思是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output里面,所以结果是标准错误和标准输出都导入文件output里面了。 至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。 这就会导致 >output 2>output 文件 output 被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的.,这就是为什么有人会写成: nohup ./command.sh >output 2>output出错的原因了 

########################## 

最后谈一下/dev/null文件的作用 

这是一个无底洞,任何东西都可以定向到这里,但是却无法打开。 

所以一般很大的stdou和stderr当你不关心的时候可以利用stdout和stderr定向到这里>./command.sh >/dev/null 2>&1 

nohup 问题

但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看 nohup.out 可以看到在关闭终端瞬间服务自动关闭。

有个操作终端时的细节:
    当shell中提示了nohup成功后还需要按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端;
    而我是每次在nohup执行成功后直接点关闭程序按钮关闭终端。
    所以这时候会断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。

    这个细节有人和我一样没注意到,所以在这儿记录一下了。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐