日期:2014-05-16  浏览次数:20730 次

linux中程序/脚本启动方式小结
linux的普及越来越高,我们在linux执行的任务也越来越多了,相对于windows开发,个人觉得linux的命令执行方式及shell脚本更加优雅灵活方便快捷(与传统cmd对比,powershell没有接触过,也就没做过对比),由于个人习惯的不通,任务的启动方式也就有了很多的差异,现在就我知道的若干种启动方式,挨个拎出来晒晒太阳吧。

顺便前说一下PATH。控制台输入命令后回车,会按照PATH里列举路径的先后顺序来查找命令。
# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

有兴趣可以自己验证一下,放一个同名脚本到不同路径,输出不同的内容,看是哪个路径下的输出。

正式开始:
一、手动运行
1、常规运行:直接写入命令后回车,这是最常用的方式。任何标准输出和错误输出都在控制台直接输出,可以利用 1> 和 2> 将输出内容重定向到文件或设备中。
关于重定向的详细内容可以参考这篇文章
http://soft.chinabyte.com/os/451/11757951.shtml
这种方式直接占用了一个终端通道,此时进程在不中止的情况下可以转换为后台进程,ctrl+z是让当前进程休眠(暂停状态),然后利用bg(background)命令将进程切换到后台执行,想再切换回前台则用fg(foreground)命令。


2、后台执行:在命令后接&。如:tail -f /var/log/dmesg > a.log &,此命令在后台执行,不占用终端通道,可以马上执行下一条命令,即使该命令耗时很久。应该注意一点,后台执行的程序如果标准输出太多,可能会导致定向目标的文件过大,甚至磁盘空间不足;即使不指定定向文件,某些版本也会把标准输出默认定向到/var/log下的某个日志文件(在centos5的某个版本中出现过,log日志把磁盘剩余空间都占满了,不过后来没复现出来,实在有点对不起各位看官)。


这两种方式有个共同的缺点,当终端退出时,不管正常或异常,该终端运行的所有还没有退出的进程都会结束,查看ps进程列表,进程的ppid会说明问题,因为所有该终端运行的进程的ppid都是终端的pid,父进程结束了,子进程当然是会结束的,没有结束的子进程会被内核进程接收。


二、定时启动
1、crontab:计划任务,介绍文章很多,就不多说了;本人习惯在crontab中设置脚本先判断服务进程是否存在,不存在则启动之。异常退出几乎在每个程序中都会出现的,拿它当个守护进程是个非常经济实惠的选择。
2、at:在指定时刻执行指定的命令序列,目前为止本人还没用过,体验了一下没用明白,有兴趣的可以自己试试看。

三、开机启动
/etc/rc.local,/etc/profile,/etc/rc.local等。/etc/inittab是系统内核加载完毕后开始寻找的第一个配置文件,摘录一下该文件内容:
# System initialization is started by /etc/init/rcS.conf
#
# Individual runlevels are started by /etc/init/rc.conf
#
# Ctrl-Alt-Delete is handled by /etc/init/control-alt-delete.conf
#
# Terminal gettys are handled by /etc/init/tty.conf and /etc/init/serial.conf,
# with configuration in /etc/sysconfig/init.
这里面指定的文件都是启动过程中被调用的脚本或配置,而这些文件中又或多或少的引用了其他的脚本,最开始提到的那两个只是最常用,也最常被人关注的,这些脚本通常的用法是设置全局变量,如PATH、JAVA_HOME、LANG等,当然也可以执行脚本和命令行了。

四、登录启动
在用户主目录下有几个文件.bashrc、.bash_profile、.bash_logout,作用跟开机启动时的类似,区别是这几个脚本是在用户登录和登出时才执行的。用处嘛,设置用户变量,提示当前用户分区容量、服务情况等。


常规的说完了,说几个不太常规的
1、nohup
我注意到很多人喜欢用这个,本人使用这个方法是在ubuntu8xx中,有次意外的发现nohup启动的进程居然终止了,从那之后毅然决然地不再使用了。

2、source
先贴一段摘自网上的解释:————————————————————————————————————————
命令用法:
source FileName
作用:在当前bash环境下读取并执行FileName中的命令。
注:该命令通常用命令“.”来替代。
如:source /etc/profile 与 . /etc/profile是等效的。
注意:source命令与shell scripts的区别是,
source在当前bash环境下执行命令,而scripts是启动一个子shell来执行命令。这样如果把设置环境变量(或alias等等)的命令写进scripts中,就只会影响子shell,无法改变当前的BASH,所以通过文件(命令列)设置环境变量时,要用source 命令。
————————————————————————————————————————
用段代码来说明一下吧
a.sh:
sleep 100 &

执行source a.sh
退出当前终端,开一个新终端,查看ps列表,我相信你们的手指头不会执行上面几步时会超过100秒,好了看到结果没,sleep 100的进程还在吧。

其实,近期发现,直接执行./a.sh也是一样的效果。

3、vnc
先开启vnc服务,然后运行终端,直接手动执行就好了,只要异常退出,vnc服务终止或者系统掉电,就绝对会运行到死。
其实这种方法不能算常规,但也不太算不常规,这个你们自己评价吧。

4、screen
这个是亮/靓点,linux本地登录时有6-8个默认终端,用alt+F1-F8切换,screen很像是这个功能和nohup的组合。
或者可以这样理解,screen启动了一个不会因为退出终端而终止的子shell,在其上执行的命令都不会因screen的退出而终止。
我发现我的语言已经不足以解释了,上代码吧:
screen
sleep 10001 &
exit

screen
sleep 10002 &
exit

screen
sleep 10003 &
exit

然后去看ps吧,不解释了,贴个地址吧,他说的比我明白。
http://www.jcwcn.com/article-22762-1.html
http://www.ibm.com/developerworks/cn/linux/l-cn-screen/
http://hi.baidu.com/xtyangjie/item/3f5aaff7e9c145de6225d23f



好了,我知道的就这么多了,欢迎补充。

最后,免费送大家一个更好玩的东西,不同终端登录同一台服务器两个用户可同时共享一个shell终端,自己看吧
http://www.linuxidc.com/Linux/2011-12/49319.htm