使用systemd设置开机启动服务

买了一个友善的nanopiM4玩,smb服务和bt下载和内网穿透搭起来之后,日思夜想终于又买了一个nas的扩展板…现在有些软件希望它开机就自动启动。
nanopiM4 + 4T硬盘
图中小机器的bt远程下载

开机启动:挂载硬盘

准备一个sh脚本文件

这个硬盘需要设置它自动休眠,否则硬盘会一直转,非常发热,控制硬盘使用的是hdparm这个软件。首先在~/tools/dx-pi-boot.sh路径创建一个脚本,挂载硬盘之后就设置硬盘的自动休眠时间。

#! /bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export PATH
# 用于pi的开机启动脚本

# 挂载硬盘吧
umount /dev/sda1
mount /dev/sda1 /home/pi/share/Disk4T
hdparm -S 60 /dev/sda #60x5秒即5分钟之后硬盘进入睡眠状态

创建一个service文件

进入/etc/systemd/system/,这文件夹下有许多service文件,都link自/lib/systemd/system/,那为什么是这样的弄法呢,google之后貌似说是自己加到lib文件夹下,然后再由管理员加到etc文件夹下。
总之先按照别人写的直接加到etc文件里试试,英语好可以输入 man systemd unit 命令看看手册。
/etc/systemd/system/文件夹下的内容
创建一个dx-pi-boot.service文件,准备以后把一些简单的开机命令都写在里面,内容如下:

[Unit]
Description=dx's boot server

[Service]
Type=simple
ExecStart=/home/pi/tools/dx-pi-boot.sh

[Install]
WantedBy=multi-user.target

按照查的百度小白的步骤,service文件创建好了之后。

sudo systemctl daemon-reload                      service文件改动后要重新载入一下
sudo systemctl enable dx-pi-boot.service

然后现在试试启动服务吧

sudo systemctl dx-pi-boot.service

嗯,然后它就顺利启动了。。如果想看一下当前的所有服务,那么可以列出所有服务,可以显示刚才文件里写的Install到的各种.target和服务的运行状态,绿色是正在运行,灰色是已经运行结束的,红色是运行失败:

sudo systemctl list-dependencies multi-user.target

现在打开一个已经内置的服务的sshd.service文件看看高手是怎么写的..

[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
Alias=sshd.service

里面有写到一个Restart动作,嗯,这个可能是我想要的。。

开机启动:启动内网穿透的frpc程序

用上内网穿透,就能在外面访问这个机器,十分的好用,实际体验速度很快,效果拔群。frpc软件我直接放在了soft文件夹,启动一下就行了。这里发现了一个坑,一开机就启动服务去联网可能还连不上网,因此启动程序会失败,所以在sh脚本里加了个20秒的延迟,20秒之后才去启动frpc软件。因为它关系到外网连接ssh远程控制这个机子,十分重要,所以我决定给它一个面子,加上Restart的设置先,出错返回的状态看看是多少。

[Unit]
Description=dx's frpc server

[Service]
Type=simple
ExecStart=/home/pi/soft/frp_0.28.2_linux_arm64/client.sh
Restart=on-failure
RestartPreventExitStatus=1

[Install]
WantedBy=multi-user.target

然后还是使用上面的步骤配置服务,然后启动。返回输出创建了一个link到multi-user.target.wants文件夹:

#使能服务
$ sudo systemctl enable dx-frpc.service 
Created symlink /etc/systemd/system/multi-user.target.wants/dx-frpc.service → /etc/systemd/system/dx-frpc.service.

另外,dx-frpc.service服务启动时候连接失败的日志如下,后面再观察一下前面写的Restart有没有作用吧:
dx-frpc.service服务启动时候连接失败的日志
根据这个返回值所以瞎写了前面RestartPreventExitStatus的值为1。

开机启动:启动qbittorrent

在使用qbittorrent的时候,首先我编译成功了arm64的带qt界面的qbittorrent程序并且可以运行,但是不带qt界面的并不能编译成功。懒得折腾了,于是就将就着使用带qt界面的qbittorrent程序,现在同样希望开机就启动它。
首先在机器不接显示器的情况下,启动带qt界面的qbittorrent程序会直接报错的。于是网上查到一个方法,加入一个export DISPLAY=’:0.0’的方法。于是得出一个脚本如下,它在使用screen来运行时能够运行的:

#! /bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
export PATH

# bt下载需要的一个显示器
export DISPLAY=':0.0'

# 好像启动失败了,看看到底执行了这个脚本没
echo `date +"%Y-%m-%d %H:%M:%S"` 执行一次dx-pi-bt.sh >> /home/pi/tools/dx-pi-bt.log

#启动 qbittorrent
qbittorrent >> /home/pi/tools/dx-pi-bt.log

然而,使用服务启动它看到log文件生成了,然而bt程序没启动。。
查看服务状态sudo systemctl list-dependencies multi-user.target,看到服务亮着一个小红灯,看来是挂了:
当前服务状态,dx-pi-bt的小红灯亮起
试了一下输出到dx-pi-bt.log文件里,结果里什么也没有记录,时间倒是记录了一条,说明脚本文件确实是执行了,黔驴技穷。想一下官方的服务管理组件总得有个地方记录日志最后一查查到服务的日志:

sudo journalctl -u dx-pi-bt.service

日志里面说无法连接到display0:0。推测可能服务执行这种界面程序可能会有问题。
dx-pi-bt.service服务的日志
算了,不折腾了这里还是就用个screen算了。


   转载规则


《使用systemd设置开机启动服务》 daixian 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
OpenCV相机模型的畸变参数与3D计算 OpenCV相机模型的畸变参数与3D计算
相机标定后有内参数矩阵和畸变校正参数。此时考虑将一个相机图像上一个点映射成3D空间中的一条射线的标准做法该如何做。 aruco模块中的例子在aruco模块中有一个函数drawAxis()这个函数能够画一个板子的起始点的坐标轴。通常结合畸变参
2019-10-12
下一篇 
Unity3d和OpenCV的相机模型 Unity3d和OpenCV的相机模型
这主要是游戏引擎里的相机模型和OpenCV里的相机模型之间的相互印证的实验。 一、Unity的相机模型考虑u3d里的相机是一个完美的针孔模型的相机,使用3d游戏里的变换方法来作出一个3D点和屏幕点(等于相机画面)的推导。 现在有u3d场景中
2019-07-19
  目录