ubuntu开机自动启动chromium os下chroot中的脚本


这篇文章记录了在ubuntu(12.04)下开机自动启动一个chromium os中的脚本所遇到的问题及解决办法。 chromium os是Google的一个开源操作系统,在src/platform/factory/py/shopfloor目录下是一些控制生产测试的脚本,通过在chroot下执行./shopfloor_server.py -m cros.factory.shopfloor.target_shopfloor来启动特定的生产测试程序。 现在需要target_shopfloor能在开机后自动运行且不能间断,所以写了一个监控脚本monitor.py来监控target_shopfloor是否在执行,如果不在执行则立即启动target_shopfloor。shopfloor_server.py是需要在chroot环境下执行的,可以通过cros_sdk -- ./shopfloor_server.py来调用shopfloor server,由于这里需要添加参数,且cros_sdk默认进入的是src/scripts目录,所以先通过cros_sdk -- ../platform/factory/py/shopfloor/target_shopfloor.sh来执行一个脚本间接启动target_shopfloor,脚本target_shopfloor.sh的内容: #!/bin/bash #由于当前的路径仍然是src/scripts cd ../platform/factory/py/shopfloor ./shopfloor_server.py -m cros.factory.shopfloor.target_shopfloor 这样就可以写一个python脚本来监控target_shopfloor的执行并在发现没有target_shopfloor的时候启动它,monitor.py如下: #!/usr/bin/python import commands import os import re import thread import time def call_shopfloor(): cros_sdk_path = ‘/home/tplink/depot_tools‘ # 由于cros_sdk在路径depot_tools里,将该路径加入PATH if cros_sdk_path not in os.environ[‘PATH‘]: os.environ[‘PATH‘] = cros_sdk_path + ‘:‘ + os.environ[‘PATH‘]
os.system("cros_sdk -- ../platform/factory/py/shopfloor/tp_shopfloor.sh") if __name__ == "__main__": # 匹配target_shopfloor启动的命令,通过[\s\S]来匹配任意字符,[.\n]是不对的,在[]内,‘.‘已经不再是元字符 regx = re.compile(r‘[\s\S]*shopfloor_server.py -m cros.factory.shopfloor.target_shopfloor‘) while True: proc = commands.getoutput("ps -x | grep tp_shopfloor") res = regx.match(proc) if res: pass else: # 使用一个线程来启动target_shopfloor,避免阻塞。 thread.start_new_thread(call_shopfloor, ()) time.sleep(1) 在shell中手动执行该脚本python monitor.py一切正常。 接下来就是将该脚本开机自动运行。 首先想到的是将脚本 cd /home/user/chromiumos python monitor.py & 加入到/etc/rc.local中,由于rc.local在启动的时候默认是root权限执行的,会导致shopfloor_server中出现错误提示不能在root权限执行,所以需要切换用户。sudo -u user python monitor.py & 为了方便查看错误信息,将rc.local的输出重定向到rc.local.log: exec 2> /home/user/chromiumos/rc.local.log exec 1>&2 set -x 通过sudo service rc.local start来查看monitor.py正常启动,且target_shopfloor也是正常启动。 但是sudo reboot重启后看到rc.local.log里的出错信息: sudo: no tty present and no askpass program specified Sorry, try again. sudo: no tty present and no askpass program specified Sorry, try again. sudo: no tty present and no askpass program specified Sorry, try again. sudo: 3 incorrect password attempts 通过visudo添加 user ALL=NOPASSWD:ALL 使得用户user用sudo时不再需要密码暂时解决了这个问题。 后来想到通过python的pexpect模块来解决这个问题。将monitor.py的代码修改成: #!/usr/bin/python import commands import os import pexpect import re import thread import time def call_shopfloor(): cros_sdk_path = ‘/home/user/depot_tools‘ if cros_sdk_path not in os.environ[‘PATH‘]: os.environ[‘PATH‘] = cros_sdk_path + ‘:‘ + os.environ[‘PATH‘] #os.system("cros_sdk -- ../platform/factory/py/shopfloor/target_shopfloor.sh") sub_proc = pexpect.spawn("cros_sdk -- ../platform/factory/py/shopfloor/target_shopfloor.sh") res = sub_proc.expect([‘password‘, pexpect.TIMEOUT, pexpect.EOF]) if res == 0: sub_proc.sendline(‘password for user\r‘) elif res == 1: pass elif res == 2: pass if __name__ == "__main__": regx = re.compile(r‘[\s\S]*shopfloor_server.py -m cros.factory.shopfloor.target_shopfloor‘)
while True: proc = commands.getoutput("ps -x | grep target_shopfloor") res = regx.match(proc) if res: pass else: thread.start_new_thread(call_shopfloor, ()) time.sleep(8) time.sleep(1)

sleep 8 sec是因为启动target_shopfloor需要一点时间。 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。