关于 Linux后台运行进程

最近在搭建kafka的过程中,发现启动相关服务后,终端界面无法再进行操作。每次都需要开启多个终端界面,实在是特别麻烦。于是就研究了下Linux后台启动程序的方法,并整理了如下的笔记。

1、后台运行的例子

nohup command > /dev/null 2>&1 &

解释:

nohup:

no hangup,不挂断地运行命令。只用nohup命令,关闭终端,进程还存在。若在终端中直接使用Ctrl+c,则会关闭进程。

command:

command是用户输入的命令,可自行设置。如“java -jar crm.jar”等。

&:

后台运行。当你只使用“&”时,关闭终端,进程会关闭。

建议:

所以当你要让程序在后台不挂断运行时,需要将nohup和&一起使用。

2、数字0,1,2的含义

linux中有三种标准输入输出,分别是STDIN,STDOUT,STDERR,对应的数字是0,1,2。STDIN是标准输入,默认从键盘读取信息;STDOUT是标准输出,默认将输出结果输出至终端;STDERR是标准错误,默认将输出结果输出至终端。

由于STDOUT与STDERR都会默认显示在终端上,为了区分二者的信息,就有了编号的0,1,2的定义,用1表示STDOUT,2表示STDERR。

关于 Linux后台运行进程

3、command >/dev/null的含义

/dev/null表示一个空设备,就是说吧command的执行结果重定向到空设备中,说白了就是不显示任何信息。

null是一个名叫null小桶的东西,如果命令的输出不想要即想丢弃输出的内容,既不想在标准输出与不想重定向到某个文件,就可将命令的输出重定向到/dev/null。这样做的好处是不会因为输出的内容过多而导致文件大小不断的增加。

命令“command > /dev/null”是一个缩写版,对于一个重定向命令,肯定是a > b这种形式,那么command > /dev/null难道是command充当a的角色,/dev/null充当b的角色。这样看起来比较合理,其实一条命令肯定是充当不了a,肯定是command执行产生的输出来充当a,其实就是标准输出stdout。所以command > /dev/null相当于执行了command 1 > /dev/null。执行command产生了标准输出stdout(用1表示),重定向到/dev/null的设备文件中。

4、 “2>&1”的含义

4.1、command>a 2>a 与 command>a 2>&1的区别

通过上面的分析,对于command>a 2>&1这条命令,等价于command 1>a 2>&1可以理解为执行command产生的标准输入重定向到文件a中,标准错误也重定向到文件a中。那么是否就说command 1>a 2>&1等价于command 1>a 2>a呢。其实不是,command 1>a 2>&1与command 1>a 2>a还是有区别的,区别就在于前者只打开一次文件a,后者会打开文件两次,并导致stdout被stderr覆盖。&1的含义就可以理解为用标准输出的引用,引用的就是重定向标准输出产生打开的a。从IO效率上来讲,command 1>a 2>&1比command 1>a 2>a的效率更高。

4.2、“2>&1”的理解

那么对于2>&1也就好理解了,2就是标准错误,1是标准输出,那么这条命令就是相当于把标准错误重定向到标准输出。所以当程序产生错误的时候,相当于错误流向左边,而左边依旧是输入到/dev/null中。

4.3、再谈nohup命令

如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中(比如:nohup command & ),除非另外指定了输出文件,比如“nohup java -jar yellowstone-web.jar > subcrible-web.log 2>&1 &”。这时,标准输出和标准错误都会保存到subcrible-web.log中。

相关推荐