将可执行程序添加为 linux 系统服务

一、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= 中设置,
    也可以
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值