systemd和控制台运行应用的不同之处

自己在使用systemd设置应用自启动时,一直被这个问题所困扰,在英文站上看到了篇不错的文章,就想着翻译一下。

原文在此https://unix.stackexchange.com/questions/339638/difference-between-systemd-and-terminal-starting-program/339645#339645

 

 

1、不同的环境变量

systemd中有关异同的文档可以通过man systemd.exec 进行查看,在 Environment variables in spawned processes章节。如果你想要自己去检查两者的不同,可以使用systemd-run /path/to/binary,这条指令会使你的app运行在一个瞬态,就像通过system service运行的一样。你可以运行Running as unit: run-u160.service 得到一些输出,在这之后使用journalctl -u run-u160.service 查看两者输出的是否相同。你也可以修改自己的app使其输出当前的环境变量,这样就可以直接对比控制台和systemd运行的环境变量差异。如果你的app不方便修改,可以直接运行systemd-run env得到环境变量。对于一些想要使用systemd启动 X11 GUI app的情况,需要查看一下X11需要的环境变量environment variable needs to be set. 在这种情况下,需要考虑是否使用桌面环境下的自动启动代替systemd。

2、资源限制
使用man systemd.resource-control 查看关于资源限制的配置。使用systemctl show your-unit-unit.service 来查看配置参数对你所需服务的影响。

3、无交互的shell
日常所使用的控制台环境都是一个可交互式的shell命令行,一般都有一个资源配置文件类似.bashrc,但是systemd是没有这种文件的。除此之外,设置环境变量的同时,脚本同时会做一些事情,类似连接ssh代理于是ssh就不需要登录了(我没有遇到过这样的用法 不知道是不是这样翻)。可以看看Difference between Login Shell and Non-Login Shell?

4、无TTY设备
日常所使用的交互会话需要连接到TTY设备,一些应用类似sudo或者ssh就需要输入密码。具体可以看看sudo: no tty present and no askpass program specified

5、绝对和相对路径
shell工作使用的是相对路径,但是system不是。查看使用文档as documented in man systemd.service,第一个参数ExecStart=必须使用绝对路径。

6、有限制的命令行语法
shell支持很多特殊字符,但systemd则有非常严格的命令行语法(参考 has a very restricted command line syntax.)。根据自己的需求,你需要复制shell语句并使用systemd来明确的运行需要的命令行语句,类似以下形式

ExecStart=/bin/bash -c '/my/bash $(syntax) >/goes-here.txt'

 

 

翻译之后进行了些微的润色,如有错误请指出。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值