V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
jiafaner
V2EX  ›  问与答

Linux 为什么要使用 systemd 啊

  •  
  •   jiafaner · 2019-02-27 16:24:00 +08:00 · 5927 次点击
    这是一个创建于 2100 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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-02-27 16:28:38 +08:00 via Android   ❤️ 2
    KasuganoSoras
        2
    KasuganoSoras  
       2019-02-27 16:29:39 +08:00
    把你的报错贴出来看看
    zhoulouzi
        3
    zhoulouzi  
       2019-02-27 16:33:36 +08:00   ❤️ 1
    没必要问为什么用, 找资料学怎么用 会查报错就够了
    Love4Taylor
        4
    Love4Taylor  
       2019-02-27 16:35:21 +08:00
    sudo systemctl status xxx.service -l 或 sudo journalctl -xe 把相关错误扔上来...
    另, 不是所有服务都可以直接一句 rc.local 搞定的.
    jiafaner
        5
    jiafaner  
    OP
       2019-02-27 16:35:22 +08:00
    @zhoulouzi
    @KasuganoSoras
    @miyuki

    感谢

    没有任何报错

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

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

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

    实在不知道怎么整了
    aver4vex
        6
    aver4vex  
       2019-02-27 16:37:13 +08:00
    是不是你的这个服务需要别的服务依赖?
    AngryPanda
        7
    AngryPanda  
       2019-02-27 16:38:17 +08:00
    @jiafaner 是不是启动顺序的问题。依赖的服务没有启动?
    jiafaner
        8
    jiafaner  
    OP
       2019-02-27 16:39:25 +08:00
    @Love4Taylor 没有显示任何错误,我怀疑是不是要配置什么权重或者叫顺序,

    我们的 socket 服务需要提前能够解析 DNS 和连接网络,我抄的 apache 的.service 文件
    jiafaner
        9
    jiafaner  
    OP
       2019-02-27 16:40:45 +08:00
    @aver4vex
    @AngryPanda

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

    我写的.service 是抄的 httpd.service
    KasuganoSoras
        10
    KasuganoSoras  
       2019-02-27 16:40:54 +08:00
    @jiafaner #8 有些服务是需要依赖网络的,你可能需要设置它在 network 起来了以后才启动
    aver4vex
        11
    aver4vex  
       2019-02-27 16:44:20 +08:00
    @jiafaner 你最好抄 sshd 的。
    jiafaner
        12
    jiafaner  
    OP
       2019-02-27 16:44:52 +08:00
    @aver4vex
    @KasuganoSoras

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


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

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

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

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

    实在快被这个东西搞死了
    CallMeReznov
        34
    CallMeReznov  
       2019-02-27 22:17:19 +08:00
    其实很简单,LZ 搜索一下默认系统里有没有较晚启动的服务,然后在配置文件 Wants 填上,试验一下会不会正常即可
    我第一次搞也是莫名其妙的(其实现在也只是会找网上的抄下来罢了)
    cy97cool
        35
    cy97cool  
       2019-02-27 22:26:58 +08:00 via Android
    我瞎猜一下 难道是\r\n 的换行方式问题?
    改成\n 换行试试
    zmz125000
        36
    zmz125000  
       2019-02-27 23:10:41 +08:00 via Android
    不同用户环境变量的问题?
    izoabr
        37
    izoabr  
       2019-02-27 23:19:12 +08:00
    我也觉得是,这东西太复杂了点,以前 init script 的时候很干净很清爽,自己很清楚都起了啥服务,都干啥用的,现在一堆服务都不知道啥玩意儿。
    但对桌面系统的话可能会比较好
    uyhyygyug1234
        38
    uyhyygyug1234  
       2019-02-27 23:39:22 +08:00
    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-02-28 07:34:30 +08:00 via iPhone
    supervisorctl 大部分人只是想要一个自动启动的守护进程罢了
    julyclyde
        40
    julyclyde  
       2019-02-28 08:03:00 +08:00
    你不需要并不代表没人需要
    你可以坚持你自己的用法啊,也不是必须学 systemd
    huyudong1991
        41
    huyudong1991  
       2019-02-28 08:22:34 +08:00 via iPhone
    加个 crond 进程检测
    ofblyt
        42
    ofblyt  
       2019-02-28 12:13:38 +08:00
    systemd 实在是太好用了
    janxin
        43
    janxin  
       2019-02-28 12:26:47 +08:00
    LZ 要么了解一下 rc.local 和 systemd 使用时候的区别?
    May725
        44
    May725  
       2019-02-28 13:26:53 +08:00
    我倒觉得 systemd 挺明朗的, 以前的脚本需要注意的内容太多了。
    julyclyde
        45
    julyclyde  
       2019-03-01 08:27:19 +08:00
    @May725 能意识到写 rc 脚本“需要注意太多”已经是高手了
    绝大多数人都是“随便写写”而已
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1030 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 21:05 · PVG 05:05 · LAX 13:05 · JFK 16:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.