此帖子讲一下我在使用树莓派system模块服务创建过程中遇到的几种情况,总结了几种常用情况,同样适用于debian系linux,方便新手快速上手.
如果你不想看,可以直接跳到最后,那里有几个现成的模版,稍微一修改就可以用了.
关键内容
- 命令行执行which先查找目标命令是否存在,例如
hass --open-ui
中hass就是目标命令2. 被运行的内容一定要加运行权限,(补)
- 创建完成以后,需要测试(补)
- sudo systemctl start a.service 如果报错了,就排错(sudo chmod 755 auto/motion.sh)
- sudo systemctl status a.service 如果是active 就ok了,否则继续排错
- 关于Unit中After和[Service]中Type=notify的关系需要注意一下
情景一:python虚拟环境下的自启动
- 刷入树莓派官方系统,略
- 修改国内数据源,网速可以建议使用官方源,出现依赖问题会少很多,国内源依赖环境不是很靠谱,略
- 最新python3版本3.7.3(最新版本已经是3.7.3了),略
- 在虚拟环境安装homeassistant,
- 配置自启动脚本失败
情景二: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
-
root权限: 简单的理解就是执行命令时, 需要带sudo .... 才能执行的时候,类似于windows的admin样的管理员权限
-
python虚拟环境启动如何书写?
按照官网虚拟环境安装法在pi账户下安装时,如果需要运行homeassistant需要到安装目录激活虚拟环境,否则命令行执行which hass命令是找不到路径的!!!(知识点:如果要在service里面引用某个依赖包去执行脚本,首先你要要能which出来,这个类似于windows安装完软件,需要配好环境变量是一样的)
解决办法: 以绝对路径执行即可(linux的绝对路径是/)
1). 在WorkingDirectory设置绝对路径.
2). /usr/local/bin/hass 这个是你要运行的命令(就是通过刚刚which命令显示出来的结果)
3). -c 是hass命令的参数,指使用哪些配置文件运行程序
-
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
- 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自启动服务
- @pi是传入用户参数,%i是取出用户参数
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
我的网易云音乐自启动
- 无日志版本(本人在用)
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
- 有日志版本(自己测)
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 复制文字