首页 > 代码库 > 进程在后台可靠运行的几种方法

进程在后台可靠运行的几种方法

Cron

a) linux系统下一个自动执行指定任务的程序,包含“时间”、“路径”、“自动执行脚本”等要素。它有如下特点:

  1. cron程序在安装系统后一般会自动随系统启动,无需每次人手启动;
  2. cron把命令行保存在/etc/crontab文件;
  3. cron服务器每分钟读取一次/etc/crontab的配置;

b) 命令解析

  1.Cron启动、重启、关闭

    #service crond start/restart/stop

  2.浏览已存在的Cron列表

    #crontab -l

  3.编辑当前用户的crontab,例如:

    1).9 9 * * * /usr/local/bin/cvsb    //表示每天早上9点9分执行目录/usr/local/bin/中的cvsb文件

    2).3 3 * * 0 /usr/local/bin/qbbak     //表示每周日凌晨3时3分执行目录/usr/local/bin中的qbbak文件

    3).* */6 * * * /usr/local/bin/esbbak     //表示每6小时执行一次,执行时间从第一次执行起计算,当然也可以自定义执行时间,比如0 */6 * * *那程序就会在整点执行

    4).20,30 * * * /usr/local/bin/esbak    //表示在每小时20分和30分时执行

    5)* 23 * * 2-5 /usr/local/bin/esbbak    //表示在星期二到星期五每天的23点执行

Daemon

a) 运行在后台的一种特殊进程(守护进程),独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。

b) Linux中专门提供了一个函数来完成这个daemon化的过程,这个函数的原型如下:int daemon( int __nochdir, int __noclose);如果nochdir的值为0,则将切换工作目录为根目录;如果noclose为0,则将标准输入,输出和标准错误都重定向到/dev /null。

c) 守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行;

d) 守护进程经常以超级用户( root )权限运行,因为它们要使用特殊的端口( 1-1024 )或访问某些特殊的资源。

e) 守护进程的工作就是打开一个端口,并且监听( Listen )等待客户连接。如果客户端产生一个连接请求,守护进程就创建( Fork )一个子服务器响应这个连接,而主服务器继续监听其他的服务请求。

  1. Nohup

a) 在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out文件中。

b) 在结尾中加上"&"来将命令同时放入后台运行。例如:nohup ping www.ibm.com &

  1. Supervisor

a) 应用程序需要24小时不间断运行。这时可使用supervisor监控应用程序的进程。当发生应用程序内部错误退出、进程被杀死等情况时,自动重启应用程序。

b) 安装supervisor

  1. 安装 setuptools                                             $sudo apt-get install python-setuptools
  2. 使用easy_install安装 supervisor:$sudo easy_install supervisor    安装完成后出现:/usr/bin/supervisord--supervisor守护进程/usr/bin/supervisorctl--supervisor服务控制程序

c) 配置supervison

  1. 将配置文件显示在控制台:$ echo_supervisord_conf
  2. 生成配置文件:$ sudo echo_supervisord_conf > /etc/supervisord.conf
  3. 在当前目录生成配置文件:$ echo_supervisord_conf > supervisord.conf
  4. 配置需要运行的程序,在配置文件中追加:         [program:helloworld]          command=./helloworld              ;执行命令process_name=%(program_name)s  autostart=true                  ; 程序是否随supervisor启动而启动autorestart=true                 ;程序停止时,是否自动重启startsecs=10

d) 启动

  1. 开启supervisor                                                  $ supervisord -c supervisord.conf
  2. 开启/停止服务                                                  # service supervisord [start | stop]
  3. 开启/停止某个程序                                                # supervisorctl [start | stop] [program名称]                       //在supervisord.conf中定义的
  4. 查看进程状态                                       $supervisorctl status

e) 添加supervisord为Linux系统服务,开机自动启动

  将supervisord.conf拷贝到 /etc 目录下

  启动脚本 supervisord.sh

  #!/bin/sh  

  #  

  # /etc/rc.d/init.d/supervisord  

  #  

  # Supervisor is a client/server system that  

  # allows its users to monitor and control a  

  # number of processes on UNIX-like operating  

  # systems.  

  #  

  # chkconfig: - 64 36  

  # description: Supervisor Server  

  # processname: supervisord  

  # Source init functions  

  . /etc/rc.d/init.d/functions  

  prog="supervisord"  

  prog_bin="/usr/local/bin/supervisord"  

  PIDFILE="/tmp/supervisord.pid"  

  start()  

  {  

  echo -n $"Starting $prog: "  

  # Source init functions  

  . /etc/rc.d/init.d/functions  

  prog="supervisord"  

  prog_bin="/usr/local/bin/supervisord"  

  PIDFILE="/tmp/supervisord.pid"start()  

  {  

  echo -n $"Starting $prog: "  

  daemon $prog_bin --pidfile $PIDFILE  

  [ -f $PIDFILE ] && success $"$prog startup" || failure $"$prog startup"  

  echo  

  }  

  stop()  

  {  

  echo -n $"Shutting down $prog: "  

  [ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"  

  echo  

  }  

  case "$1" in  

  start)  

  start  

  ;;  

  stop)  

  stop  

  ;;  

  status)  

  status $prog  

  ;;  

  restart)  

  stop  

  start  

  ;;  

  *)  

  echo "Usage: $0 {start|stop|restart|status}"  

  ;;  

  esac  

添加为系统服务

# mv supervisord.sh  /etc/init.d/supervisord

# chkconfig --add  supervisord

# chkconfig --level 345 supervisord on

  1. Screen

a) Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。

b) Screen命令

  1. 开启一个screen:                                        [root@tivf06 ~]# screen
  2. 命名screen,例如命名一个test screen:                    [root@TS-DEV ~]# screen -S screen
  3. 关闭一个screen:Ctrl-a,d
  4. 查看所有的screen:                                   [root@TS-DEV ~]# screen -ls 
  5. 重新连接screen:                                     [root@TS-DEV ~]# screen -r 12865
  6. 清楚dead screen:                                   [root@TS-DEV ~]# screen -wipe

 

进程在后台可靠运行的几种方法