用Python监视进程是否结束

平时不打游戏在Linux下的时间比较长,用VirtualBox装了个XP可以上上QQ,用用其他一些只有Windows版的软件,这两天下BoA的演唱会又用到了网盘,而且网盘的客户端软件只支持Windows,这样就只能在VirtualBox里下载,可是下载结束自动关机的功能就失效了。。于是想到能不能VirtualBox自动关闭的同时,也能让Linux也一起关闭。

不知道有什么简便的方法可以实现,只想到了用Python写个小脚本(过去一直用Python来解决一些小问题),于是去网上搜了Python相关的类库,其中os.system函数可以调用Linux命令,初步想了下,准备用一个线程来不断执行ps命令,并检查VirtualBox的进程是否还存在,如果不存在了,就执行halt

不过尝试了一下用os.system调用ps后,输出的结果无法保存到变量中,看了一个帖子,发现os.popen可以解决,os.popen可以像打开文件一样执行一条Linux命令,命令返回的结果可以通过读取文件的方式获得。

通过ps ax|grep VirtualBox|grep xp的组合命令可以得到正在执行xp的虚拟机进程,其中xp是自己设定的虚拟机的标题,一般得到的结果会有2条,1条就是虚拟机进程,另1条是grep命令本身,所以当得到的结果只剩下grep命令本身时,说明虚拟机已经关闭。

由于我用的Linux发行版是Ubuntu,执行关机命令需要sudo并且输入密码,所以要让自动关机能够实现还有一步是,设定用户执行sudo不需要输入密码,这可以通过sudo visudosudoers文件进行修改,在文件最后加上chocobo ALL=(ALL) NOPASSWD: ALL其中chocobo是用户名。

好了,准备工作都做完,就可以执行脚本监视进程啦,具体代码如下:

#!/usr/bin/env python

import os
import time

def autohalt():
    while True:
        ps_string = os.popen('ps ax | grep VirtualBox | grep xp','r').read()
        ps_strings = ps_string.strip().split('\n')
        if len(ps_strings) < 2:
            os.system('sudo halt')
            return
        else:
            print 'Still',len(ps_strings),'Processes, waiting 10s...'
            time.sleep(10)

if __name__=='__main__':
    autohalt()

参考资料:

  1. http://docs.python.org/library/os.html#os.system
  2. http://docs.python.org/library/os.html#os.popen
  3. http://maestric.com/doc/unix/ubuntu_sudo_without_password
相关文章
  • 牛年小节续
    前段时间牛年小节写了没多少内容就发觉已经出轨了,而且是出轨后继续行驶1000公里,真正在牛年做的事情好像没记录多少,今天再来回忆一下,顺便当笔记用了,哈哈。 学位论文发表了,虽然自己感觉有点豆腐...

Comments (4)

  1. 14:23, 2010-07-21Justice  / Reply

    沙花

  2. 20:56, 2010-07-21木头  / Reply

    grep -v grep可以剔除grep出来的那个grep

    其实直接可以写sh啊

    while [ `ps -ef | grep VirtualBox | grep xp | grep -v grep | wc -l` -ne 0 ]
    do
    echo xp is still running
    done
    echo shutdown
    sudo halt

  3. 21:05, 2010-07-21chocobo  / Reply

    @木头
    哇,我就是不会shell,所以啥事情都信派森,这样while会不会cpu 100%?

  4. 22:38, 2010-07-21木头  / Reply

    @chocobo
    那就sleep个60~300嘛

Leave a Reply

Allowed Tags - You may use these HTML tags and attributes in your comment.

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

使用新浪微博登陆

Pingbacks (0)

› No pingbacks yet.