查看: 2100|回复: 1

Edison开机启动程序最科学合理的方法

[复制链接]
  • TA的每日心情
    慵懒
    2017-2-21 13:12
  • 签到天数: 21 天

    [LV.4]偶尔看看III

    发表于 2017-6-13 17:57 | 显示全部楼层 |阅读模式
    本帖最后由 const 于 2017-12-13 17:17 编辑

           开机自动执行指定程序,是一个非常普遍的需求,实现的手段也非常多,具体参考linux的各种做法就可以了。下面要讲的是在Edison上所使用的最科学的方法,为什么说他最科学,看完具体的方法之后,你就会有所理解。
           首先准备好我们需要执行的程序,这当然是必须的。要多说一点的是,程序必须具有可执行的权限,使用 chmod +x 文件名 可以为程序添加可执行权限。
           然后,进入到 /lib/systemd/system 目录,我们可以看到有许多 *.service的文件,这就是Edison上用来控制服务的配置文件。服务,可以看作是一个在后台管理各种需要自动运行的程序的管理者。这里拿一个简单的文件作为示例进行讲解。
    以wpa_supplicant.service,为例,这是启动Edison的wifi连接的服务。
    [mw_shl_code=bash,true][Unit]
    Description=WPA supplicant service
    Requires=sys-subsystem-net-devices-wlan0.device
    After=sys-subsystem-net-devices-wlan0.device

    [Service]
    Type=simple

    # start wpa_supplicant service :
    #    - the second interface p2p-dev-wlan0 is automatically created at startup
    #    - the file wpa_supplicant is common to both interfaces wlan0 and p2p-dev-wlan0
    ExecStart=/usr/sbin/wpa_supplicant -u -c/etc/wpa_supplicant/wpa_supplicant.conf -iwlan0 -Dnl80211

    # start wpa_supplicant_event service after the start of wpa_supplicant service
    ExecStartPost=/bin/systemctl start wpa_supplicant_wlan0_event

    # stop wpa_supplicant_event service after the stop of wpa_supplicant service
    ExecStopPost=/bin/systemctl stop wpa_supplicant_wlan0_event

    [Install]
    WantedBy=multi-user.target[/mw_shl_code]
    先大概讲解一下各个部分。首先这类文件的格式都是基本固定的,[Unit],[Service]和[Install]必须要有,Description是对这个服务的描述,随便写就可以。Requires表示本服务依赖于哪个或哪些其他服务,有多个依赖的话,用空格隔开写在同一行即可。After表示没有依赖关系,但需要在这些服务启动之后再启动。用来管理一个系统中多个服务启动的先后顺序。同样还有一个Before键,功能类似。
    下面是控制程序运行的部分,ExecStart表示服务启动时,需要运行的程序,可以通过调用你的shell程序加上复杂的参数来完成更复杂的功能。ExecStartPost同样是需要执行的操作,但是是在ExecStart执行成功后才会执行的。可以理解成开始执行程序的收尾工作或者后续工作,没有可以不写。最后WantedBy用来控制服务所在的运行等级,multi-user.target表示在多用户环境下启动该服务,若运行等级与该参数不匹配,服务不会启动。

    之所以说这种方法科学,其一三因为还可以通过restart参素控制该服务在启动失败后是否重启,过多久重启,例如Restart=on-failure,RestartSec=5表示当启动失败时,间隔5秒重启。还可以通过Type值控制服务的启动类型,Type=simple表示常规类型,即通过systemctl enable/disable 服务名来开启/关闭该服务是否每次开机启动,systemctl start/stop 服务名来控制开始/停止服务,若取oneshot,则只会启动一次。
    最为有用的一点是StandardOutput,若取StandardOutput=journal则该服务下的程序在运行过程中的所有打印输出,都会被记录至日志文件,可以通过journalctl -u 服务名来查看日志。还有更多的操作可以翻阅systemctl 和 journalctl 的操作手册。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    这个F()函数是做什么的?
    这个F()函数是做什么的
    如图上,在看代码的时候,发现了这么一个函数,然后后面又一行英文注释。 我用有道翻
    隔离论坛在搞一个开源的arduino墨水屏,值得入手吗?
    隔离论坛在搞一个开源的ar
    amobbs论坛出来了一个众筹的arduino的墨水屏终端,100多块钱,有大神加入了吗? 看着
    两轮自平衡小车的线性CCD循迹总结
    两轮自平衡小车的线性CCD
    继之前的两轮自平衡小车的制作总结(https://www.arduino.cn/thread-99011-1-1.html)
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表