linux后台执行程序,& nohup

来源:互联网 发布:win10系统网络连不起网 编辑:程序博客网 时间:2024/05/18 03:50
 启动程序,通过执行.sh文件。
启动后,关闭SSH客户端,启动的程序就停止了。如何解决?网上的解决方法是:在命令后加“ &”引号中间的,前面有空格。

正确方法: nohup solasi.sh &       

但是程序会出入日志和错误信息如果解决?

完美解放方案:nohup solasi.sh >console.txt 2>&1 &

 

对上面命令的解释:

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

>console.txt 2>&1
>console.txt 将标准输出重定向到console.txt文件中
其实操作系统有三个常用的流:
0:标准输入流 stdin
1:标准输出流 stdout
2:标准错误流 stderr
一般当我们用 > console.txt,实际是 1>console.txt的省略用法;< console.txt ,实际是 0 < console.txt的省略用法。
java的日志类默认是输出到system.err中,所以要想将日志内容重定向到console.txt,需要将stderr重定向到console.txt.
将stderr重定向到console.txt的命令是 2 < console.txt。
不过有个问题,stdout是有缓冲的,而stderr是没有缓冲的,原因很简单,stderr一般是系统发生错误,比如编译一个程序出错,需要立即给出编译错误提示。
所以如果写成 sh auto.sh > console.txt 2 > console.txt就会出现问题。

再来看看 >& 操作符:

重定向操作符描述

>

将命令输出写入到文件或设备(如打印机),而不是命令提示符窗口或句柄。

<

从文件而不是从键盘或句柄读入命令输入。

>>

将命令输出添加到文件末尾而不删除文件中已有的信息。

>&

将一个句柄的输出写入到另一个句柄的输入中。

<&

从一个句柄读取输入并将其写入到另一个句柄输出中。

|

从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。

而句柄的定义就是:

句柄句柄的数字代号描述

STDIN

0

键盘输入

STDOUT

1

输出到命令提示符窗口

STDERR

2

错误输出到命令提示符窗口

UNDEFINED

3-9

句柄由应用程序单独定义,它们是各个工具特有的

所以 2 >& 1就是把 stderr重定向到stdout 由于stdout被重定向到 console.txt,所以最终stderr,stdout均被重定向到console.txt并且解决了两者缓冲区不一致的问题。