mschedule 简单Linux进程管理(树莓派)

树莓派是神奇的机器,CPU和内存都少的可怜,但体积小功耗低,在上面搞些动搞些西其实也挺有意思,挺好玩的。装的是pidara,基本服务没有精简多少,先cat一下CPU和RAM。

    [able@raspi ~]$ cat /proc/cpuinfo 
    Processor       : ARMv6-compatible processor rev 7 (v6l)
    BogoMIPS        : 464.48
    Features        : swp half thumb fastmult vfp edsp java tls 
    CPU implementer : 0x41
    CPU architecture: 7
    CPU variant     : 0x0
    CPU part        : 0xb76
    CPU revision    : 7
    
    Hardware        : BCM2708
    Revision        : 000e
    Serial          : 000000003123ffdc
    [able@raspi ~]$ cat /proc/meminfo 
    MemTotal:         446672 kB
    MemFree:          289976 kB
    Buffers:           16872 kB
    Cached:            65868 kB
    SwapCached:            0 kB
    Active:            88652 kB
    Inactive:          50360 kB
    Active(anon):      58692 kB
    Inactive(anon):      844 kB
    Active(file):      29960 kB
    Inactive(file):    49516 kB
    Unevictable:           0 kB
    Mlocked:               0 kB
    HighTotal:             0 kB
    HighFree:              0 kB
    LowTotal:         446672 kB
    LowFree:          289976 kB
    SwapTotal:        524284 kB
    SwapFree:         524284 kB
    Dirty:                16 kB
    Writeback:             0 kB
    AnonPages:         56284 kB
    Mapped:            16088 kB
    Shmem:              3268 kB
    Slab:               9684 kB
    SReclaimable:       5664 kB
    SUnreclaim:         4020 kB
    KernelStack:         656 kB
    PageTables:         1292 kB
    NFS_Unstable:          0 kB
    Bounce:                0 kB
    WritebackTmp:          0 kB
    CommitLimit:      747620 kB
    Committed_AS:     211148 kB
    VmallocTotal:     565248 kB
    VmallocUsed:        5024 kB
    VmallocChunk:     347144 kB
    [able@raspi ~]$ 

树莓派可能是为了节省成本,并没有安装时间模块,所以每次开机时间都会被重置。因为很久没有动过电烙铁了,所以没有想过给它装上个硬件模块。 所以想到的方法是同步网络时间。开始的时候,搞个启动脚本,开机启动同步时间,可是每当机器重启时,半个小时都启动不了,而且就算启动了,也没有 同步时间。于是想第二个方法,用根用户的crontab,结果不知道为何,没有同步,crontab执行其他任务是没有问题的,原因还不明。

另外一个问题,因为树莓派是通过网线连接TP-LINK路由的,同时有个小米盒子连着。小米盒子是个神奇的东西,只有你连接上TP-LINK的路由的,其他 电脑或手机设备就很难连接进去,即使是断开了小米盒子,状况依然无法解决。所以,老妹一看连接不上,就拔电源重启。可以将一些应用程序做成自启动, 可是并不是所有的程序都像nginx一样完善,会切换用户执行。

还有一个问题,就是有些程序coredump,让它自动重启,系统配置貌似还做不到(可能可以做到)。我还想在树莓派上面跑个DHT爬虫,但DHT爬虫太占 网络了,如果一直开着的话,网络就基本废了。所以我是想在周一到五凌晨才开始运行,到17点就停了,可以配置之类的。

基于上面种种需求,自己搞了个非常简单管理调度程序,特点:
1. 可以管理三类程序,常驻进程(挂掉会自动重启),一次进程(负责启动,不管是否成 功),优先的一次进程(负责启动,不管是否成功,具有最高优先级,所以程序必须等到此类程序退出后,方启动其他程序)
2. 可以指定运行的用户,必须有相应的权限
3. 常驻进程可以配置运行时间。

缺点:
1. 没有为每个进程分配优先级
2. 没有设计没有进程的依赖关系

相关配置文件:

    [nginx@raspi bin]$ cat mysch.conf 
    #程序运行参数
    #程序配置段PROG_LIST配置
    #[NGINX]
    #程序启动的命令
    #RUN_COMMAND=/sbin/ntpdate 1.cn.pool.ntp.org
    #运行该程序的用户组
    #RUN_GROUP=nginx
    #运行该程序的用户
    #RUN_USER=nginx
    #程序运行标志
    # -1 程序启动后先等待其运行完毕方可运行其它程序
    #  0 程序启动后不管其运行状态
    #  1 程序按照RUN_TIME配置时间点运行,非该运行点自动停止通过kill信号
    #RUN_FLAG=1
    #RUN_FLAG=1时有效,程序运行时间段,星期(1-7),时间格式(24小时),各条件之间是或关系
    #RUN_TIME=1-5,23:30-16:30|1-5,17:30-21:30|6-7,00:00-8:30
    
    [COMMON]
    #日志路径
    LOG_PATH=/home/nginx/bin/log
    #日志头
    LOG_HEADER=schedule
    #文件日志级别all,debug,info,warn,error,fatal,off
    LOG_LEVEL=debug
    #文件日志缓存,byte
    LOG_BUFFER=102400
    #文件切换时间,秒数
    LOG_SWITCH_TIME=86400
    
    #睡眠时间
    SLEEP_TIME = 60
    #推出时是否退出子程序
    KILL_CHILD_FLAG = 1
    #pid文件后,台执行时有效
    PID_FILE=/home/nginx/bin/log/mysch.pid
    #运行的用户
    RUN_USER=root
    PROG_LIST=NTP|NGINX|BIGFALSE
    
    [NTP]
    RUN_COMMAND=/usr/sbin/ntpdate 1.cn.pool.ntp.org
    RUN_USER=root
    RUN_FLAG=-1
    
    [NGINX]
    RUN_COMMAND=/home/nginx/www/sbin/nginx
    RUN_USER=nginx
    RUN_FLAG=1
    RUN_TIME=1-7,00:00-24:00
    RUN_PID_FILE=/home/nginx/www/logs/nginx.pid
    
    [BIGFALSE]
    RUN_COMMAND=/usr/bin/Python /home/nginx/tinytrue/manage.py runfcgi host=127.0.0.1 port=7856 daemonize=true pidfile=/home/nginx/tinytrue/log/django.pid outlog=/home/nginx/tinytrue/log/access.log errlog=/home/nginx/tinytrue/log/error.log
    RUN_USER=nginx
    RUN_FLAG=1
    RUN_TIME=1-7,00:00-24:00
    RUN_PID_FILE=/home/nginx/tinytrue/log/django.pid

按照这个配置,运行的程序:

    [nginx@raspi bin]$ p nginx
    root       233     1  0 14:41 ?        00:00:00 /home/nginx/bin/mysch -c /home/nginx/bin/mysch.conf
    nginx      304     1  0 14:42 ?        00:00:00 nginx: master process /home/nginx/www/sbin/nginx
    nginx      305   304  0 14:42 ?        00:00:00 nginx: worker process     
    nginx      307     1  0 14:42 ?        00:00:00 /usr/bin/Python /home/nginx/tinytrue/manage.py runfcgi host=127.0.0.1 port=7856 daemonize=true pidfile=/home/nginx/tinytrue/log/django.pid outlog=/home/nginx/tinytrue/log/access.log errlog=/home/nginx/tinytrue/log/error.log
    nginx      308   307  0 14:42 ?        00:00:00 /usr/bin/Python /home/nginx/tinytrue/manage.py runfcgi host=127.0.0.1 port=7856 daemonize=true pidfile=/home/nginx/tinytrue/log/django.pid outlog=/home/nginx/tinytrue/log/access.log errlog=/home/nginx/tinytrue/log/error.log
    nginx      309   307  0 14:42 ?        00:00:00 /usr/bin/Python /home/nginx/tinytrue/manage.py runfcgi host=127.0.0.1 port=7856 daemonize=true pidfile=/home/nginx/tinytrue/log/django.pid outlog=/home/nginx/tinytrue/log/access.log errlog=/home/nginx/tinytrue/log/error.log
    nginx      310   307  0 14:42 ?        00:00:04 /usr/bin/Python /home/nginx/tinytrue/manage.py runfcgi host=127.0.0.1 port=7856 daemonize=true pidfile=/home/nginx/tinytrue/log/django.pid outlog=/home/nginx/tinytrue/log/access.log errlog=/home/nginx/tinytrue/log/error.log
    nginx      311   307  0 14:42 ?        00:00:06 /usr/bin/Python /home/nginx/tinytrue/manage.py runfcgi host=127.0.0.1 port=7856 daemonize=true pidfile=/home/nginx/tinytrue/log/django.pid outlog=/home/nginx/tinytrue/log/access.log errlog=/home/nginx/tinytrue/log/error.log
    nginx      312   307  0 14:42 ?        00:00:10 /usr/bin/Python /home/nginx/tinytrue/manage.py runfcgi host=127.0.0.1 port=7856 daemonize=true pidfile=/home/nginx/tinytrue/log/django.pid outlog=/home/nginx/tinytrue/log/access.log errlog=/home/nginx/tinytrue/log/error.log

相关代码:
https://github.com/buf1024/mysch