全部博文(2065)
分类: LINUX
2010-01-04 12:51:18
Linux制作系统服务让服务代码在后台跑
[整理人:hkebao@126.com 整理时间:
一、如何将你的代码做成系统服务
第一步:编写一个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 的方式调用