V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
whx20202
V2EX  ›  程序员

为什么我用 systemd 创建的服务全部都会自动关闭?

  •  
  •   whx20202 · 2017-03-06 16:09:48 +08:00 · 3687 次点击
    这是一个创建于 2601 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我的操作系统是 Ubuntu 16.04.02LTS 是从 14.04 升上去的 比如 squid : /usr/local/squid/sbin/squid -s 是后台启动 /usr/local/squid/sbin/squid -k shutdown 是关闭

    我新增了一个文件:/lib/systemd/system/squid.service

    [Unit]
    Description=squid , a HTTP(S) proxy server
    Documentation=https://blog.ruiruige1991.xyz
    After=network.target  
    
    [Service]
    Type=simple
    ExecStart=/usr/local/squid/sbin/squid -s
    ExecStop=/usr/local/squid/sbin/squid -k shutdown
    ExecReload=/usr/local/squid/sbin/squid -k reconfigure
    

    然后每次执行systemctl start squid.service,发现都起不来

    执行journald -xe 发现有以下日志:

    Mar 06 16:04:41 NyaVM-VPS-updwugzl systemd[1]: Started squid , a HTTP(S) proxy server.
    -- Subject: Unit squid.service has finished start-up
    -- Defined-By: systemd
    -- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
    -- 
    -- Unit squid.service has finished starting up.
    -- 
    -- The start-up result is done.
    Mar 06 16:04:41 NyaVM-VPS-updwugzl squid[21867]: Squid Parent: will start 1 kids
    Mar 06 16:04:41 NyaVM-VPS-updwugzl squid[21867]: Squid Parent: (squid-1) process 21870 started
    Mar 06 16:04:41 NyaVM-VPS-updwugzl squid[21868]: squid: No running copy
    

    个人感觉:

    • 很多时候起一个服务是起不来的
    • 不管我是否起来了,感觉它会在服务启动的一瞬间就去执行 stop 的相关任务

    有没有人有这方面的经验?

    10 条回复    2017-03-07 13:00:58 +08:00
    jasontse
        1
    jasontse  
       2017-03-06 16:11:25 +08:00 via iPad
    Type 改成 forking
    whx20202
        2
    whx20202  
    OP
       2017-03-06 16:12:50 +08:00
    @jasontse 能不能解释一下为什么呢?
    我之前也尝试搜过,有人说 simple 就可以了还说 forking 只是兼容老版本的程序,这个 forking 到底是什么意思啊
    whx20202
        3
    whx20202  
    OP
       2017-03-06 16:14:40 +08:00
    @jasontse 成功了!
    能稍微说一下吗? 或者说个关键技术我去谷歌
    jasontse
        4
    jasontse  
       2017-03-06 16:15:19 +08:00 via iPad   ❤️ 3
    @whx20202 在前台会阻塞的程序可以用 simple ,后台服务用 forking 。如果你想了解什么是 fork 请搜索 Linux Daemon 。
    SpicyCat
        6
    SpicyCat  
       2017-03-06 16:50:05 +08:00
    如果有耐心,看看 systemd 系列的 manpage, 讲得很详细。
    julyclyde
        7
    julyclyde  
       2017-03-06 21:10:36 +08:00
    @whx20202 你需要关注的是“为什么 forking 是兼容老版本”而不是“ forking 是兼容老版本”
    ryd994
        8
    ryd994  
       2017-03-07 09:18:12 +08:00 via Android
    因为 squid 默认 fork 到后台执行
    simple 只检查前台进程,前台退了就意味结束了
    我记得加-N 可以不 fork
    forking 会尝试检测 fork 出来的后台
    此外还可以通过 pidfile 显式指定
    对于执行一遍就一直有效的,比如 RC local 脚本, one-shot
    loveminds
        9
    loveminds  
       2017-03-07 12:59:44 +08:00
    因为这类东西的原理是由前台进程派生出守护进程后就退出,而 simple 只能检测你运行进程的状态
    loveminds
        10
    loveminds  
       2017-03-07 13:00:58 +08:00
    “感觉它会在服务启动的一瞬间就去执行 stop 的相关任务”正是这种方式的显著特点,派生出守护进程后,控制台进程退出
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2816 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 14:39 · PVG 22:39 · LAX 07:39 · JFK 10:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.