本篇将会讲解linux的如何后台运行一个程序以及开机启动机制和如果设置开机启动,同时会提供一些参考资料。
先说如何后台运行,确切的手势终端关闭后终端中启动的进程不被结束。
我们都知道linux的程序是以终端为单位的。如果在终端中启动了某个程序,当终端关闭后,相应的程序也会终止。
为什么会这样呢?因为linux中某个终端启动的进程都是其子进程,当终端关闭后,linux就会收到hung up (挂电话的意思)的信号,然后把对应终端的子进程都关闭,然后就没有然后了。。。
所以要使某个进程不被结束,有两种办法:
1.让linux忽略终端的hung up 信号,不关闭进程;
2.让此进程变为终端的非子进程。
第一种的实现方案就是nohup命令。
例如要启动jboss,可以nohup ./run.sh &。这样就可以了,结尾的“&”符号表示后台启动jboss,从而不影响继续运行其他命令。
但这样有一个问题,nohup命令虽然可以让linux“放过”这个进程,但是nohup会同时把进程的控制台输出重定向到nohup.txt下(默认是这个文件),当然可以重定向为其他的文件,但是输出总会有的。
如果jboss运行很长时间,而且如果有很多控制台输出的话,nohup.txt文件就会变的很大很大。
通常项目中的日志都会输出到特定的日志文件或者输出到数据库中,也就是说控制台的输出对于程序的意义不大,那么可不可以抛弃掉这些输出呢?答案是肯定的。
这里讲解一下linux的重定向(注意,是linux的重定向,不是针对nohup)。
0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出。
在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号。例如,将某个程序的错误信息输出到log文件中:./program 2>log。这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。
另外,也可以实现0,1,2之间的重定向。2>&1:将错误信息重定向到标准输出。
Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。
结合nohup,我们可以这样nohup ./run.sh >/dev/null &
这是最简单的一种方式,既保证了程序能够一直后台执行,又能保证不会产生太大的nohup.txt文件。
第二种方式就是利用的linux的一个机制,让程序在subshell中执行,方法很简单,将命令用括号() 括起来即可。
ps -ef | grep test
可以看到run.sh的父进程为1,不是当前终端了,这样就能忽略hung up信号。
当然linux还可以动态的让程序后台运行或不被hung up 信号关闭,例如disown命令,setid命令等。
可以参考这篇文章:http://www.cnblogs.com/xianghang123/archive/2011/08/02/2125511.html
下篇文章继续讲解linux的开机启动机制。