nohup命令详解
一、背景说明:
启动服务的时候,如果使用如下命令,则会在start.sh脚本所在的目录下,产生一个名为 nohup.out 的输出文件
nohup ./startup.sh &
可以看到下面这个例子,一开始当前目录是没有nohup.out文件的,经过这行命令之后就可以查看到当前脚本输出的信息在nohup.out文件里了。
如果不想要这个多余的 nohup.out 文件,可以使用如下命令解决:
nohup ./startup.sh >/dev/null 2>&1 &
二、命令解析:
1、nohup和尾部 &
1)nohup 是no hangup,不要挂断,永久运行。关闭终端,当前运行的进程不终止,标准输出内容会输出到当前目录的 nohup.out 日志文件中而不显示在终端。
2)命令最后一个 &,表示后台运行的意思,和 nohup 配置表示不挂断后台运行。
2、>/dev/null 和 2>&1
1)/dev/null 是 Linux 一个空设备文件,通常也被称为位桶(bit bucket)或黑洞,这个文件接收到任何数据都会被丢弃,也就是不输出任何信息到终端。
2)> 代表重定向到哪里;重定向的符号有两个:> 或 >>,> 会先清空文件,然后再写入内容,>> 会将重定向的内容追加到现有文件的尾部。
3)Linux系统预留了三个文件描述符:0、1 和 2,他们的意义如下所示:
①0:标准输入流 stdin
②1:标准输出流 stdout,默认值是1
③2:标准错误流 stderr
4)">/dev/null" 等价于 "1>/dev/null",表示标准输出(1)输出到 /dev/null 中,即终端不输出标准输出信息;
"2>&1" 中的 “&” 是等价于的意思,表示标准错误(2)输出的位置等价于标准输出(1)的位置,即等价于 “2>/dev/null”, 即终端不输出标准错误信息。
因此,">/dev/null 2>&1" 表示 标准错误信息和标准输出信息,在终端上均不输出。
三、指定输出文件:
如果想要将服务启动和运行过程中的日志信息输出到指定位置(比如:/var/log/start.log),可以参考如下命令:
nohup ./startup.sh >/var/log/start.log 2>&1 &
或者
nohup sh startup.sh >/var/log/start.log 2>&1 &
四、sh xxx.sh与./xxx.sh区别:
sh xxx.sh是用sh执行startup.sh,startup.sh可以没有执行标志,可以不用加./,可以不用在脚本第一行写上#!/bin/sh。./startup.sh是调用脚本第一行制定的shell去解释执行,缺省为sh,就是bash。