测验环境:Fedora7,管理员:root,普通用户:test1
实现目标:在Linux发动时,主动运转坐落普通用户test1根目录下的脚本程序test.py,该程序会在每次履行时主意向本地日志文件追加一条记载,源码如下:
from datetime import datetime
now=datetime.now()
f=open(‘test.log’,’a’)
f.write(‘%s ‘%now)
f.close()
Linux在发动时,会主动履行/etc/rc.d目录下的初始化程序,因而咱们能够把发动使命放到该目录下,有两种方法:
计划一:
1.由于其间的rc.local是在完结一切初始化之后履行,因而咱们能够把发动脚本写到里边
2.用root账号登陆Linux,vi /etc/rc.d/rc.local修改文件,在最终参加两行需求履行的脚本程序:
cd /home/test1 –该步不行少,否则会提示没有权限翻开’test.log’文件
su test1 -c python /home/test1/test.py –把要履行的指令作为一个参数传递级su
计划二:
1.init.d目录下都为可履行程序,他们其实是服务脚本,依照必定格局编写,Linux 在发动时会主动履行,相似Windows下的服务
2.用root帐号登录,vi /etc/rc.d/init.d/mystart,追加如下内容:
#!/bin/bash
#chkconfig:2345 80 05 –指定在哪几个等级履行,0一般指关机,
6指的是重启,其他为正常发动。80为发动的优先级,05为封闭的优先机
#description:mystart service
RETVAL=0
start(){ –发动服务的进口函数
echo -n mystart serive …
cd /home/test1
su test1 -c python /home/test1/test.py
}
stop(){ –封闭服务的进口函数
echo mystart service is stoped…
}
case $1 in –运用case,能够进行交互式操作
start)
start
;;
stop)
stop
;;
esac
exit $RETVAL
3.运转chmod +r /etc/rc.d/init.d/mystart,使之可直接履行
4.运转chkconfig –add mystart,把该服务添加到装备傍边
5.运转chkconfig –list mystart,能够检查该服务进程的状况
总结:
两种计划的的中心都是切换用户到test1,然后履行指令发动Python程序,做成服务的优点是能够界说多个交互指令,比方:start,stop,restart,reset…,在服务运转的过程中还能够做相应操作。最开端的时分,我依照一般的思路写了如下脚本,却怎样也履行不了:
su test1 –切换到test1用户
cd /home/test1 –切换到根目录
python test.py –履行python程序
exit –退出test1帐号
看起来好象一切都没错,可是发现只运转了榜首行的指令,后边的都没有运转,直到退出test1用户后才发现好象履行完毕。剖析原因,是由于Linux发动的时分是在root帐号下,履行su test1等于翻开了一个新的shell脚本,因而下面的代码都在等着新的Shell脚本完毕才干运转,就象在主程序里调用了一个子程序,而子程序是个死循环,一下出来来成果下面的要等死了。知道了产生的原因,那么处理的方法就相对简略了,就是在履行上述脚本程序时,不要脱离自身的Shell。咱们能够把履行指令做为su的一个参数传递进去,由于没有涉及到翻开新的Shell,因而能够正常履行你希望的脚本程序,顺利实现开机主动发动指定的脚本程序。