一、Linux 程序配置成服务
使用 unitree z1 机械臂时,z1-controller 程序需要到 build 目录下才能正常启动(配置文件路径问题),因其主要功能封装在 so 动态库内、外部无法修改,在做成 linux 系统服务时不能直接写程序的全路径,需要做特殊处理,先进入它所在的目录,再执行启动命令,格式如下所示:
[Unit]
Description=Unitree Z1 Controller Service
After=network.target
[Service]
Type=simple
User=my_name
Restart=on-failure
RemainAfterExit=yes
RestartSec=5s
ExecStart=/bin/bash -c "cd /home/unitree/z1-controller/build; ./z1_ctrl"
[Install]
WantedBy=multi-user.target
二、Linux 系统服务配置项说明:
Type=
设置进程的启动类型(simple, forking, oneshot, dbus, notify, idle):
"simple" : 一般服务。 如果此进程需要为其他进程提供服务,
在该进程启动前应先建立好通信渠道(例如:套接字),以加快后继单元的启动速度。
"dbus" : 进程需要在 D-Bus 上获得一个由 BusName= 指定的名称。
systemd 在启动后继单元前,确保该进程已经成功的获取了指定的 D-Bus 名称。
此类型隐含的依赖了 dbus.socket 单元。
"oneshot" : 进程必须在 systemd 启动后继单元前退出。
本类型需要设置 RemainAfterExit= 选项。
"forking" : 进程在启动过程中使用 fork() 系统调用。它是传统 UNIX 守护进程的经典做法。
也就是当所有的通信渠道都已建好、启动成功后,父进程将会退出,
子进程将作为该服务的主进程继续运行。
建议同时设置 PIDFile= 选项,以帮助 systemd 准确定位该服务的主进程,
进而加快后继单元的启动速度。
"notify" : 进程在启动完成之后通过 sd_notify 发送一个通知消息。
系统在启动后继单元前,确保该进程已经成功发送了消息。类型设置为 notify 那么
NotifyAccess= 将只能设置为 "all" 或者 "main"(默认)。
注意 Type=notify 不能在 PrivateNetwork=yes 的情况下正常工作。
"idle" : 进程延迟到所有的操作都完成之后再执行。
RemainAfterExit=
表示服务的所有进程全部退出后,是否依然将此服务视为活动(active)状态。
默认值为 "no", 也可设为 "yes"。
GuessMainPID=
无法明确定位服务主进程的情况下,systemd 是否猜测主进程的 PID(可能不正确)。
该选项仅在设置了 Type=forking 但未设置 PIDFile= 的情况下有意义。
如果 PID 猜测错误,那么该服务的失败检测与自动重启功能将失效。
可设为"yes"(默认值)或"no"
PIDFile=
守护进程的 PID 文件,必须是绝对路径。
强烈建议在 Type=forking 的情况下明确设置此选项。
systemd 在服务启动后、从此文件中读取主守护进程的 PID 。
systemd 不会写入此文件,但会在此服务停止后删除它(若存在)。
BusName=
设置与此服务通信所使用的 D-Bus 名称。
在 Type=dbus 的情况下必须明确设置此选项。
BusPolicy=
如果设置了此项,那么 systemd 将会创建一个自定义的kdbus端点(endpoint),
并将其安装为该服务默认的总线节点(bus node)。
这个自定义的端点可以拥有它自己的策略规则。端点的名称就是其所服务的单元的名称。
端点的节点(node)将被绑定挂载到默认的总线节点的位置,这样该服务就只能通过它自己的端点访问总线。
注意,自定义端点的默认策略是'拒绝所有',
因此必须在 BusPolicy = 中明确的添加必要的允许策略。
这个选项的值由两部分组成:总线名 + 访问级别,中间以空格分隔。
访问级别必须是 see, talk, own 之一,并且 talk 隐含了 see,而 own 隐含了 talk 与 see 。
如果对同一个总线名称多次指定了访问级别,那么将以拥有最大权限的那个为准。
例如: BusPolicy=org.freedesktop.systemd1 talk BusPolicy=org.foo.bar see
该选项仅在内核开启了kdbus(即将并入官方内核)支持的情况下有意义。
ExecStart=
在启动该服务时需要执行的命令行(命令+参数)。
仅在设置了 Type=oneshot 的情况下,才可以设置任意个命令行(包括零个),
否则必须且只能设置一个命令行。
多个命令行既可以在同一个 ExecStart= 中设置,
也可以