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

systemd 脚本规范

  •  
  •   cevincheung · 2015-02-03 11:15:20 +08:00 · 5646 次点击
    这是一个创建于 3614 天前的主题,其中的信息可能已经有所发展或是发生改变。

    centos7/debian8(jessie)/fedora latest/suse都试过了~完美啊

    [Unit]
    Description=mysql rdbms
    
    [Service]
    Type=simple
    GuessMainPID=yes
    ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/my.cnf
    ExecStop=kill /data/mysql/mysql.pid
    Restart=systemctl stop mysql && systemctl start mysql
    
    [Install]
    WantedBy=multi-user.target
    

    https://zh.opensuse.org/openSUSE:How_to_write_a_systemd_service

    第 1 条附言  ·  2015-02-03 14:08:24 +08:00
    修正版(pgsql的)

    [Unit]
    Description=PostgreSQL-XL Master Node

    [Service]
    Type=forking
    User=pgsql
    GuessMainPID=yes
    ExecStart=/usr/local/pgxl/bin/pg_ctl -D /data/pg-hma -l /data/pglog/hma start
    ExecStop=/usr/local/pgxl/bin/pg_ctl -D /data/pg-hma -l /data/pglog/hma stop
    Restart=always

    [Install]
    WantedBy=multi-user.target
    29 条回复    2015-02-04 10:38:02 +08:00
    XiaoxiaoPu
        1
    XiaoxiaoPu  
       2015-02-03 11:59:34 +08:00
    Restart 那一行多余了
    cevincheung
        2
    cevincheung  
    OP
       2015-02-03 12:02:30 +08:00
    @XiaoxiaoPu 求解,刚接触
    XiaoxiaoPu
        3
    XiaoxiaoPu  
       2015-02-03 12:16:24 +08:00
    @cevincheung 查了一下不是多余,是错了。Restart 是指定当服务结束、终止、超时后是否重新启动,可选的值有 no, on-success, on-failure, on-abnormal, on-watchdog, on-abort, always。至于重启一个服务需要执行哪些命令,不需要特别指定,systemd 会自己判断
    XiaoxiaoPu
        4
    XiaoxiaoPu  
       2015-02-03 12:16:42 +08:00
    @cevincheung 可以看 man systemd.service
    cevincheung
        5
    cevincheung  
    OP
       2015-02-03 12:27:37 +08:00
    @XiaoxiaoPu 那也没有ExecRestart就是systemd已经自己实现自己去调用stop && start 咩?
    XiaoxiaoPu
        6
    XiaoxiaoPu  
       2015-02-03 12:29:50 +08:00
    @cevincheung 对,甚至你连 ExecStop 那一行也不需要,systemd 根据 Type 来判断如何 stop
    cevincheung
        7
    cevincheung  
    OP
       2015-02-03 12:32:42 +08:00
    @XiaoxiaoPu
    让mysql结束后并没有自己起来啊…… - -#
    XiaoxiaoPu
        8
    XiaoxiaoPu  
       2015-02-03 12:39:05 +08:00
    @cevincheung 什么意思?
    cevincheung
        9
    cevincheung  
    OP
       2015-02-03 12:39:51 +08:00
    @XiaoxiaoPu restart不是失败自动重启咩?
    XiaoxiaoPu
        10
    XiaoxiaoPu  
       2015-02-03 12:42:33 +08:00
    @cevincheung 要看 restart 后面设置的值,而且这里的失败是指程序意外终止(比如段错误什么的)
    cevincheung
        11
    cevincheung  
    OP
       2015-02-03 12:44:42 +08:00
    @XiaoxiaoPu 就是systemd不做健康监控。
    XiaoxiaoPu
        12
    XiaoxiaoPu  
       2015-02-03 12:50:32 +08:00
    @cevincheung 默认没有,你可以设置,比如下面这个示例,如果失败,那么 5 秒后重试:

    [Unit]
    Description=Create AP Service

    [Service]
    Type=simple
    ExecStart=/usr/bin/bash create_ap wifi0 net0 -g 10.12.5.1 -c 7 -w 2 xiaoxiao puxiaoxiao
    KillSignal=SIGINT
    Restart=on-failure
    RestartSec=5

    [Install]
    WantedBy=multi-user.target
    cevincheung
        13
    cevincheung  
    OP
       2015-02-03 12:53:14 +08:00
    @XiaoxiaoPu

    如果启动成功后进程崩溃重启呢?
    9hills
        14
    9hills  
       2015-02-03 12:54:38 +08:00 via iPad   ❤️ 1
    首先systemd的一大好处是基于cgroups不依赖于pid,所以stop多余了。restart是用来设置是否自动恢复的。


    Systemd的好处是配置文件极端简洁。
    XiaoxiaoPu
        15
    XiaoxiaoPu  
       2015-02-03 12:55:28 +08:00
    @cevincheung 把 on-failure 换成 always
    cevincheung
        16
    cevincheung  
    OP
       2015-02-03 12:59:47 +08:00
    @XiaoxiaoPu 如果是临时手动结束(比如更改一下配置文件)那他就自动又重新启动了?
    XiaoxiaoPu
        17
    XiaoxiaoPu  
       2015-02-03 13:10:37 +08:00   ❤️ 1
    @cevincheung 如果是用 systemctl stop 结束的不会
    coolcfan
        18
    coolcfan  
       2015-02-03 13:13:55 +08:00
    解开了很多误区!

    已感谢!
    cevincheung
        19
    cevincheung  
    OP
       2015-02-03 13:18:27 +08:00
    @XiaoxiaoPu 像postgresql这种需要切换到指定用户角色的程序呢?

    forking
    sudo -u pgsql xxxxx/pg_ctl -D ....

    失败
    XiaoxiaoPu
        20
    XiaoxiaoPu  
       2015-02-03 13:26:39 +08:00   ❤️ 1
    @cevincheung 在 [Service] 里加上 User=pgsql
    9hills
        21
    9hills  
       2015-02-03 13:31:43 +08:00 via iPad
    Draplater
        22
    Draplater  
       2015-02-03 14:03:39 +08:00 via Android
    &&是shell 的语法,systemd不运行shell,不能这么写
    digimoon
        23
    digimoon  
       2015-02-03 14:39:17 +08:00
    systemd怎么设置环境变量和启动多个程序呢?还有就是启动一个程序触发另外一个,关闭这个也触发挂起另外一个等等
    cevincheung
        24
    cevincheung  
    OP
       2015-02-03 14:47:07 +08:00   ❤️ 1
    @digimoon
    Environment="ONE=one" 'TWO=two two'
    ExecStart=/bin/echo $ONE $TWO ${TWO}
    proudzhu
        25
    proudzhu  
       2015-02-03 14:47:53 +08:00
    arch 里面基本上都带了 systemd service 文件,mariadb(mysql) 的如下
    https://projects.archlinux.org/svntogit/packages.git/tree/trunk/mariadb.service?h=packages/mariadb
    msg7086
        26
    msg7086  
       2015-02-04 03:36:51 +08:00
    msg7086
        27
    msg7086  
       2015-02-04 03:40:16 +08:00   ❤️ 1
    顺便一提。
    systemd 下 mysql 可以很方便地一台机器跑多个实例了。
    以前都要借助于 mysql_multi 来实现。
    而现在只要编写不同的 service 文件,给不同实例加上不同的 --data-dir 和 --socket / bind-address 启动参数即可。
    cevincheung
        28
    cevincheung  
    OP
       2015-02-04 10:18:13 +08:00
    @msg7086 还是习惯用defaults-file
    msg7086
        29
    msg7086  
       2015-02-04 10:38:02 +08:00
    @cevincheung 是在defaults-file之后加上这些。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1448 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 17:22 · PVG 01:22 · LAX 09:22 · JFK 12:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.