Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29956073
  • 博文数量: 2065
  • 博客积分: 10377
  • 博客等级: 上将
  • 技术积分: 21525
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-04 17:50
文章分类

全部博文(2065)

文章存档

2012年(2)

2011年(19)

2010年(1160)

2009年(969)

2008年(153)

分类: LINUX

2010-01-04 12:51:18

Linux制作系统服务让服务代码在后台跑

[整理人:hkebao@126.com  整理时间:2010-1-4]

一、如何将你的代码做成系统服务

第一步:编写一个SHELL脚本命名为ServerSocket 代码如下:

#!/bin/bash

#include

#chkconfig:345 85 15

#cp ServerSocket /etc/init.d/ServerSocket

#chmod +x /etc/init.d/ServerSocket

#chkconfig --level 345 ServerSocket on

pidfile=/sysadmin/ServerSocket.pid

pidno=

start()

{

echo -n "start ServerSocket..."

if test -e $pidfile

then

    echo -n "service is running"

    exit 1

else

    /usr/bin/python /sysadmin/ServerSocket.py &

    pidno=$$

    pidno=`expr $pidno + 1`

    echo  $pidno > $pidfile

    sleep 3

    exit 0;

fi

}

stop()

{

echo -n "stop ServerSocket..."

if test -e $pidfile

then

    kill  `cat $pidfile` >/dev/null 2 >null

    if [ $? -ne 0 ]

    then

        echo -n "another instance is running,`cat $pidfile`"

        exit 1

    else

        rm -f $pidfile

    fi

    echo -n "ok"

else

    echo -n "logm is not running"

fi

}

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

stop

sleep 10

start

;;

*)

echo -n "usage: $0 start|stop|restart"

exit 0;

esac

 

第二步:cp ServerSocket /etc/init.d/

将此SHELL脚本拷贝到我们的系统根目录下面

第三步:赋上可执行的权限

chmod +x /etc/init.d/ServerSocket

 

第四步:测试

service ServerSocket start  表示启动我们的服务。

 

系统服务运行成功。现在进入第二个主题:如何让我们的系统命令在后台执行?

因为我们现在的系统命令是

import os

os.system("service mysql restart")     

如果service ServerSocket start  会弹出

start ServerSocket...Shutting down MySQL[  OK  ]

Starting MySQL.

会弹出这个窗口出来。就好像之前在WIN平台上面做任务计划一样的。后来我就使用了一小段的VBS脚本解决!

 

解决方案:

我们知道python调用系统命令有三种方案

os.system()   只是执行命令不返回命令的结果集

使用此命令的缺点:
A. os.system()
是新起一个shell去干活的,对系统的开销比较大 (新开一个SHELL去干活)
B.
获得输出等信息比较麻烦,不能与外部命令或工具交互
C.
无法控制,(如果调用的外部命令,挂死或者执行时间很长),主进程无法控制os.system(), 因为调用os.system(cmd) 调用进程会block until os.system() 自己退出

 

os.popen()    会返回执行之后的结果对象

tmp = os.popen('ls *.py').readlines()     就能够将我们的命令执行过的结果返回

subprocess   相当于是父进程会调用子进程。有一个超时的机制

 

我们可以这样来测试:

换用os.popen方式进行调用也是可以

 

方案:不用os.system 而是换用os.popen 的方式调用

阅读(932) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-04-21 16:31:53

无论如何要在自已的领域专精