jiafaner
V2EX  ›  问与答

Linux 为什么要使用 systemd 啊

By jiafaner at 2019 年 2 月 27 日 · 6827 次点击
linux 为什么要使用 systemd 啊

过去把脚本写到 rc.local 里面就行了

现在都是什么啊,一两个服务,配置了一下午都没有弄起来,

执行 systemctl start xxx.service 就能够运行

可就是不能自动执行,即使我用过 systemctl enable xxx.service

还有什么地方需要设置吗?
45 条回复  •  2019-03-01 08:27:19 +08:00
miyuki
   1
miyuki  
   2019 年 2 月 27 日 via Android   ❤️ 2
KasuganoSoras
   2
KasuganoSoras  
   2019 年 2 月 27 日
把你的报错贴出来看看
zhoulouzi
   3
zhoulouzi  
   2019 年 2 月 27 日   ❤️ 1
没必要问为什么用, 找资料学怎么用 会查报错就够了
love4taylor
   4
love4taylor  
   2019 年 2 月 27 日
sudo systemctl status xxx.service -l 或 sudo journalctl -xe 把相关错误扔上来...
另, 不是所有服务都可以直接一句 rc.local 搞定的.
jiafaner
   5
jiafaner  
OP
   2019 年 2 月 27 日
@zhoulouzi
@KasuganoSoras
@miyuki

感谢

没有任何报错

我照着文档把所有能做的,都做了

现在的情况是登录后直接用 systemctl start,服务就启来了

可是,不手工执行却不能够自动启动

实在不知道怎么整了
aver4vex
   6
aver4vex  
   2019 年 2 月 27 日
是不是你的这个服务需要别的服务依赖?
AngryPanda
   7
AngryPanda  
   2019 年 2 月 27 日
@jiafaner 是不是启动顺序的问题。依赖的服务没有启动?
jiafaner
   8
jiafaner  
OP
   2019 年 2 月 27 日
@Love4Taylor 没有显示任何错误,我怀疑是不是要配置什么权重或者叫顺序,

我们的 socket 服务需要提前能够解析 DNS 和连接网络,我抄的 apache 的.service 文件
jiafaner
   9
jiafaner  
OP
   2019 年 2 月 27 日
@aver4vex
@AngryPanda

不熟悉依赖的服务是什么意思,查了文档说有依赖关系,我们的服务就是启动后去远程注册一下,然后就在本机接收 socket 请求,用 httpd 差不多的

我写的.service 是抄的 httpd.service
KasuganoSoras
   10
KasuganoSoras  
   2019 年 2 月 27 日
@jiafaner #8 有些服务是需要依赖网络的,你可能需要设置它在 network 起来了以后才启动
aver4vex
   11
aver4vex  
   2019 年 2 月 27 日
@jiafaner 你最好抄 sshd 的。
jiafaner
   12
jiafaner  
OP
   2019 年 2 月 27 日
@aver4vex
@KasuganoSoras

我抄一下 sshd 的试试
mason961125
   13
mason961125  
   2019 年 2 月 27 日
我觉得你用了 systemctl --user 然后还没有 loginctl enable-linger
mason961125
   14
mason961125  
   2019 年 2 月 27 日
顺带说一句,systemd 这种方便的依赖关系,你用 rc.local 实现起来难度要大的多。
MeteorCat
   15
MeteorCat  
   2019 年 2 月 27 日 via Android
你是不是启动脚本没给权限
season4675
   16
season4675  
   2019 年 2 月 27 日
因为 systemd 异步启动,启动速度更快啊。而且里面自带各种系统,用起来也方便~~~
kkhu2004
   17
kkhu2004  
   2019 年 2 月 27 日
如果急的话,可以先用这方法,每次启动会自动执行。
corntab -e
里面加上
@reboot 你要运行的命令
guokeke
   18
guokeke  
   2019 年 2 月 27 日 via Android
当初改 systemd 社区一片骂声。
SakuraKuma
   19
SakuraKuma  
   2019 年 2 月 27 日
chkconfig on ???? 试试
k9982874
   20
k9982874  
   2019 年 2 月 27 日
@jiafaner #5 你这是明显没有让服务随系统启动。执行 systemctl enable xxx 试试
这真不是 systemd 的锅
k9982874
   21
k9982874  
   2019 年 2 月 27 日
@k9982874 #20 楼主执行过了 systemctl enable,审题不严谨。。查服务日志吧
hcymk2
   22
hcymk2  
   2019 年 2 月 27 日
syste m d 有 debug 模式有日志的。
dbw9580
   23
dbw9580  
   2019 年 2 月 27 日 via Android
你得把你的配置文件贴出来啊,不然是要隔空猜吗?
https://superuser.com/questions/955922/enabled-systemd-unit-does-not-start-at-boot
ik0r
   24
ik0r  
   2019 年 2 月 27 日
[Unit]
Description=blablabla
Requires=systemd-networkd.service
After=network-online.target systemd-resolved.service
Wants=network-online.target systemd-resolved.service
ik0r
   25
ik0r  
   2019 年 2 月 27 日
使用 systemd 挂载 smb 的时候遇到过, 需要 network OK 了才行
biggray0312
   26
biggray0312  
   2019 年 2 月 27 日 via Android
楼主你试试把配好的 systemd service 文件放到系统挂载点下的目录中, 比如 /etc/systemd/.../ 下,再去 enable,也许就好了。我过去的经验告诉我这个和 service 文件的位置是有关系的。
Ansen
   27
Ansen  
   2019 年 2 月 27 日
systemctl enable xxx
mason961125
   28
mason961125  
   2019 年 2 月 27 日
哦...想起来了,systemctl daemon-reload 了吗?
reself
   29
reself  
   2019 年 2 月 27 日 via Android
如果 start 能正常启动而 enable 不能正常自动启动的话,考虑是服务依赖的问题,调整一下服务依赖,按依赖顺序启动应该就没问题了
kernel
   30
kernel  
   2019 年 2 月 27 日
你要用回 rc.local 也是一句话的事儿
hljjhb
   31
hljjhb  
   2019 年 2 月 27 日 via Android
帖 service 内容有这么难么 让大家帮着一起猜(〜 ̄▽ ̄)〜
tabris17
   32
tabris17  
   2019 年 2 月 27 日
systemd 的确是好东西,启动脚本写起来太麻烦了
jiafaner
   33
jiafaner  
OP
   2019 年 2 月 27 日
@tabris17
@hljjhb
@kernel
@reself
@Ansen
@Jeremial
@Jeremial
@k9982874
@kkhu2004
@MeteorCat


谢谢大家,我临时用了一个 cron 去启动,然后先解决了线上服务的问题。

这时候,我用了我的虚拟机,也是 CentOS,用了一模一样的 systemd 的配置,居然能自动启动了

我在线上机器上再试了,还是不行,我自己的 CentOS 里面却能用

我再研究研究,看看是怎么回事

实在快被这个东西搞死了
CallMeReznov
   34
CallMeReznov  
   2019 年 2 月 27 日
其实很简单,LZ 搜索一下默认系统里有没有较晚启动的服务,然后在配置文件 Wants 填上,试验一下会不会正常即可
我第一次搞也是莫名其妙的(其实现在也只是会找网上的抄下来罢了)
mYYnSmiTEQWcCwAr
   35
mYYnSmiTEQWcCwAr  
   2019 年 2 月 27 日 via Android
我瞎猜一下 难道是\r\n 的换行方式问题?
改成\n 换行试试
zmz125000
   36
zmz125000  
   2019 年 2 月 27 日 via Android
不同用户环境变量的问题?
izoabr
   37
izoabr  
   2019 年 2 月 27 日
我也觉得是,这东西太复杂了点,以前 init script 的时候很干净很清爽,自己很清楚都起了啥服务,都干啥用的,现在一堆服务都不知道啥玩意儿。
但对桌面系统的话可能会比较好
uyhyygyug1234
   38
uyhyygyug1234  
   2019 年 2 月 27 日
centos 我之前记录了一个样例

配置 Supervisor 开机启动:

vi /usr/lib/systemd/system/supervisord.service

[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target


配置开机自启
systemctl enable supervisord

验证一下是否为开机启动:systemctl is-enabled supervisord
q397064399
   39
q397064399  
   2019 年 2 月 28 日 via iPhone
supervisorctl 大部分人只是想要一个自动启动的守护进程罢了
julyclyde
   40
julyclyde  
   2019 年 2 月 28 日
你不需要并不代表没人需要
你可以坚持你自己的用法啊,也不是必须学 systemd
huyudong1991
   41
huyudong1991  
   2019 年 2 月 28 日 via iPhone
加个 crond 进程检测
ofblyt
   42
ofblyt  
   2019 年 2 月 28 日
systemd 实在是太好用了
janxin
   43
janxin  
   2019 年 2 月 28 日
LZ 要么了解一下 rc.local 和 systemd 使用时候的区别?
May725
   44
May725  
   2019 年 2 月 28 日
我倒觉得 systemd 挺明朗的, 以前的脚本需要注意的内容太多了。
julyclyde
   45
julyclyde  
   2019 年 3 月 1 日
@May725 能意识到写 rc 脚本“需要注意太多”已经是高手了
绝大多数人都是“随便写写”而已
© 2026 V2EX · 93ms · 3.9.8.5