请选择 进入手机版 | 继续访问电脑版

『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 4215|回复: 2

[基础教程] 树莓派Systemd开机自启动几种情况的书写方式

[复制链接]

11

主题

53

帖子

325

积分

论坛分享达人

积分
325
金钱
262
HASS币
70
发表于 2020-7-8 22:21:08 | 显示全部楼层 |阅读模式
本帖最后由 zhanghy 于 2020-7-11 22:25 编辑

此帖子讲一下我在使用树莓派system模块服务创建过程中遇到的几种情况,总结了几种常用情况,同样适用于debian系linux,方便新手快速上手.
如果你不想看,可以直接跳到最后,那里有几个现成的模版,稍微一修改就可以用了.

关键内容

  1. 命令行执行which先查找目标命令是否存在,例如 hass --open-ui 中hass就是目标命令2. 被运行的内容一定要加运行权限,(补)
  2. 创建完成以后,需要测试(补)
    • sudo systemctl start a.service 如果报错了,就排错(sudo chmod 755 auto/motion.sh)
    • sudo systemctl status a.service 如果是active 就ok了,否则继续排错
  3. 关于Unit中After和[Service]中Type=notify的关系需要注意一下

情景一:python虚拟环境下的自启动

  1. 刷入树莓派官方系统,略
  2. 修改国内数据源,网速可以建议使用官方源,出现依赖问题会少很多,国内源依赖环境不是很靠谱,略
  3. 最新python3版本3.7.3(最新版本已经是3.7.3了),略
  4. 在虚拟环境安装homeassistant,
  5. 配置自启动脚本失败
    情景二:node.js服务器的自启动
    在安装网易云音乐插件的后台服务器时使用了nodejs版的网易云音乐,因为我的树莓派是armv7的,docker镜像没有arm版本的网易云音乐
    情景三:开机运行python等语言的脚本

在说具体脚本之前,先简单说一下system的service的文件结构,只说常用的(ps:我会用的)

sudo nano -w /etc/systemd/system/name.service #创建并编辑文件
[Unit]
Description=yourDescription #这个地方可以随意
After=network.service network.service #声明在这个服务在这些服务启动成功后启动,多个服务中间用空格
[Service]
Type=simple # 我只用过两种,一个是这个默认值simple,另一个是notify,类型是notify的可以写在[Unit]的After里面,notify是指启动成功以后通知其它服务,普通的不能通知
User=root #执行人, 一般不用写,需要root权限就写 1⃣️
Group=root #执行的用户组,一般不用写,需要root权限就写
WorkingDirectory=/home/pi/autoWifi # 命令执行的目录
WorkingDirectory=/home/pi/homeassistant # 命令执行的目录
ExecStart=/usr/local/bin/hass -c "/home/pi/.homeassistant" #要执行的命令2⃣️
ExecStart=/usr/bin/python server.py #要执行的命令 3⃣️
ExecStart=/usr/bin/python server.py #要执行的命令 4⃣️
[Install]
WantedBy=multi-user.target
# ^x保存

# 最后保存,然后写入如上内容,执行
sudo systemctl --system daemon-reload
sudo systemctl enable home-assistant.service
  1. root权限: 简单的理解就是执行命令时, 需要带sudo .... 才能执行的时候,类似于windows的admin样的管理员权限

  2. python虚拟环境启动如何书写?
    按照官网虚拟环境安装法在pi账户下安装时,如果需要运行homeassistant需要到安装目录激活虚拟环境,否则命令行执行which hass命令是找不到路径的!!!(知识点:如果要在service里面引用某个依赖包去执行脚本,首先你要要能which出来,这个类似于windows安装完软件,需要配好环境变量是一样的)
    解决办法: 以绝对路径执行即可(linux的绝对路径是/)
    1). 在WorkingDirectory设置绝对路径.
    2). /usr/local/bin/hass 这个是你要运行的命令(就是通过刚刚which命令显示出来的结果)
    3). -c 是hass命令的参数,指使用哪些配置文件运行程序

  3. python虚拟环境启动如何书写?
    1). 通过python运行 -> 如图所示
    2). 通过脚本运行 -> 书写一个.sh,然后运行它, WorkingDirectory是.sh所在目录 ----》 这是一个万能钥匙

#!bin/bash
# 这是.sh文件内容
cd /home/....../sh文件路径
python test.py
# 这是service文件内容
[Unit]
Description=myfan
After=network-online.target

[Service]
ExecStart=/home/pi/temp_control_1/myfan.sh # 这个是我写的pwm调速风扇脚本,你可以替换成你的脚本位置, 这种写法基本上是万能的,包括前面的那个虚拟环境问题也能解决

[Install]
WantedBy=multi-user.target
  1. node.js启动方式?
    1). 通过脚本运行脚本的方式,刚刚提到过
    2). 通过node命令执行WorkingDirectory=/home/pi/devs/NeteaseCloudMusicApi # 命令执行的目录
    ExecStart=/usr/bin/node run app.js
    3). 通过forever执行,可以保留日志forever安装
    记得加-g,forever要求安装到全局环境下:sudo npm install forever -g
    建立软连接
    sudo ln -s  /usr/local/node/lib/node_modules/forever/bin/forever /usr/lib/forever
    sudo ln -s  /usr/local/node/lib/node_modules/forever/bin/forever /usr/bin
    service 文件的运行改成如下内容:
ExecStart=/usr/bin/forever start  -l /home/pi/forever.log -a app.js 

Demo

我的homeassistant自启动服务

  1. @pi是传入用户参数,%i是取出用户参数
  2. After=network-online.target mysql.service 如果同目录没有mysql.service文件,一定要去掉mysql.service
sudo nano -w /etc/systemd/system/[email protected]

  GNU nano 3.2                                        mailto:[email protected]

[Unit]
Description=Home Assistant
After=network-online.target mysql.service
[Service]
Type=simple
User=%i
WorkingDirectory=/home/%i/.homeassistant
ExecStart=/home/%i/homeassistant/bin/hass -c "/home/%i/.homeassistant"

[Install]
WantedBy=multi-user.target

                                                    [ 已读取 11 行 ]
^G 求助        ^O 写入        ^W 搜索        ^K 剪切文字    ^J 对齐        ^C 游标位置    M-U 撤销       M-A 标记文字
^X 离开        ^R 读档        ^\ 替换        ^U 还原剪切    ^T 拼写检查    ^_ 跳行        M-E 重做       M-6 复制文字

sudo systemctl enable mailto:[email protected] systemctl --system daemon-reload

我的网易云音乐自启动

  1. 无日志版本(本人在用)
sudo nano -w /etc/systemd/system/cloudmusic.service

  GNU nano 3.2                                           cloudmusic.service

[Unit]
Description=cloudmusic
After=network-online.target

[Service]
ExecStart=/usr/bin/node /home/pi/devs/NeteaseCloudMusicApi/app.js

[Install]
WantedBy=multi-user.target

                                                        [ 已读取 9 行 ]
^G 求助        ^O 写入        ^W 搜索        ^K 剪切文字    ^J 对齐        ^C 游标位置    M-U 撤销       M-A 标记文字
^X 离开        ^R 读档        ^\ 替换        ^U 还原剪切    ^T 拼写检查    ^_ 跳行        M-E 重做       M-6 复制文字

sudo systemctl enable cloudmusic.service
sudo systemctl --system daemon-reload
  1. 有日志版本(自己测)
sudo nano -w /etc/systemd/system/cloudmusic.service

  GNU nano 3.2                                           cloudmusic.service

[Unit]
Description=cloudmusic
After=network-online.target

[Service]
WorkingDirectory=/home/pi/devs/NeteaseCloudMusicApi
ExecStart=/usr/bin/forever start -l /home/pi/forever.log -a app.js

[Install]
WantedBy=multi-user.target

                                                        [ 已读取 9 行 ]
^G 求助        ^O 写入        ^W 搜索        ^K 剪切文字    ^J 对齐        ^C 游标位置    M-U 撤销       M-A 标记文字
^X 离开        ^R 读档        ^\ 替换        ^U 还原剪切    ^T 拼写检查    ^_ 跳行        M-E 重做       M-6 复制文字

sudo systemctl --system daemon-reload
sudo systemctl enable cloudmusic.service
sudo systemctl --system daemon-reload

普通脚本自启动

motion服务器启动

sudo nano -w /etc/systemd/system/motion.service

  GNU nano 3.2                                             motion.service

[Unit]
Description=myfan
After=network-online.target

[Service]
ExecStart=/home/pi/auto/motion.sh

[Install]
WantedBy=multi-user.target

                                                        [ 已读取 9 行 ]
^G 求助        ^O 写入        ^W 搜索        ^K 剪切文字    ^J 对齐        ^C 游标位置    M-U 撤销       M-A 标记文字
^X 离开        ^R 读档        ^\ 替换        ^U 还原剪切    ^T 拼写检查    ^_ 跳行        M-E 重做       M-6 复制文字

sudo systemctl --system daemon-reload
sudo systemctl enable motion.service
sudo systemctl --system daemon-reload

motioneye脚本

  GNU nano 3.2                                            motioneye.service

[Unit]
Description=motionEye Server
After=network-online.target motion.service

[Service]
ExecStart=/usr/local/bin/meyectl startserver -c /etc/motioneye/motioneye.conf
Restart=on-abort

[Install]
WantedBy=multi-user.target

                                                       [ 已读取 10 行 ]
^G 求助        ^O 写入        ^W 搜索        ^K 剪切文字    ^J 对齐        ^C 游标位置    M-U 撤销       M-A 标记文字
^X 离开        ^R 读档        ^\ 替换        ^U 还原剪切    ^T 拼写检查    ^_ 跳行        M-E 重做       M-6 复制文字

自动重连wifi脚本


  GNU nano 3.2                                            autowifi.service

[Unit]
Description=auto wifi
After=network.service

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/home/pi/auto
ExecStart=/usr/bin/python autowifi.py# ExecStart=autowifi.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target
                                                       [ 已读取 15 行 ]
^G 求助        ^O 写入        ^W 搜索        ^K 剪切文字    ^J 对齐        ^C 游标位置    M-U 撤销       M-A 标记文字
^X 离开        ^R 读档        ^\ 替换        ^U 还原剪切    ^T 拼写检查    ^_ 跳行        M-E 重做       M-6 复制文字

python脚本


  GNU nano 3.2                                               autowifi.py

#!/usr/bin/python
import os, time
while True:
    if '192' not in os.popen('ifconfig | grep 192').read():
        print '\n****** wifi is down, restart... ******\n'
        os.system('sudo /etc/init.d/networking restart')
    time.sleep(3*60) #5 minutes

                                                        [ 已读取 7 行 ]
^G 求助        ^O 写入        ^W 搜索        ^K 剪切文字    ^J 对齐        ^C 游标位置    M-U 撤销       M-A 标记文字
^X 离开        ^R 读档        ^\ 替换        ^U 还原剪切    ^T 拼写检查    ^_ 跳行        M-E 重做       M-6 复制文字

脚本

  GNU nano 3.2                                               autowifi.sh

#!/bin/sh
python /home/pi/auto/autowifi.py &

                                                        [ 已读取 2 行 ]
^G 求助        ^O 写入        ^W 搜索        ^K 剪切文字    ^J 对齐        ^C 游标位置    M-U 撤销       M-A 标记文字
^X 离开        ^R 读档        ^\ 替换        ^U 还原剪切    ^T 拼写检查    ^_ 跳行        M-E 重做       M-6 复制文字








WX20200708-215341@2x.png

评分

参与人数 1金钱 +20 HASS币 +10 收起 理由
+ 20 + 10 感谢楼主分享!

查看全部评分

回复

使用道具 举报

11

主题

53

帖子

325

积分

论坛分享达人

积分
325
金钱
262
HASS币
70
 楼主| 发表于 2020-7-8 22:30:11 | 显示全部楼层
加了样式以后丢内容太严重了,哎,补写了好几次,不是那个味了
回复

使用道具 举报

123

主题

4620

帖子

1万

积分

管理员

囧死

Rank: 9Rank: 9Rank: 9

积分
15963
金钱
11258
HASS币
45
发表于 2020-7-9 09:00:44 | 显示全部楼层
zhanghy 发表于 2020-7-8 22:30
加了样式以后丢内容太严重了,哎,补写了好几次,不是那个味了

楼主,不用费心加这么多样式,普通文本加上插入代码就插好。

                               
登录/注册后可看大图
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-3-29 08:45 , Processed in 0.134975 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表