systemd不等待我的服务单位,以启动下一个

问题描述:

这里是我的两个单元之前完成:systemd不等待我的服务单位,以启动下一个

- name: percona_db.service 
    command: start 
    enable: true 
    content: | 
    [Unit] 
    Description=Percona db 
    After=docker.service 
    Requires=docker.service 

    [Service] 
    ExecStartPre=/bin/bash -c '/usr/bin/docker start -a mysql_datastore || /usr/bin/docker run -d -v /var/lib/mysql --name mysql_datastore -p 23:23 busybox' 
    ExecStart=/bin/bash -c '/usr/bin/docker start -a mypercona || /usr/bin/docker run -i -t --volumes-from mysql_datastore --name="mypercona" -p 3306:3306 --rm percona' 
    ExecStop=/usr/bin/docker stop mypercona 

    [Install] 
    WantedBy=multi-user.target 
- name: php_fpm.service 
    command: start 
    enable: true 
    content: | 
    [Unit] 
    Description=php fpm 
    After=percona_db.service 
    Requires=percona_db.service 

    [Service] 
    ExecStart=/bin/bash -c '/usr/bin/docker start -a myphpfpm_53 || /usr/bin/docker run --name myphpfpm_53 -dit -p 9000:9000 --link mypercona:db phpfpm_53' 
    ExecStop=/usr/bin/docker stop myphpfpm_53 

    [Install] 
    WantedBy=multi-user.target 

我的问题是这样的:通过 推出percona_db.service泊坞窗容器罐有时需要很长的时间加载(如果是第一次加载,它会创建数据库并添加数据,可能需要一些时间)。 php_fpm服务需要percona服务启动,因为我将它们链接在一起。 而且,即使我指定:

After=percona_db.service 
Requires=percona_db.service 

systemd尝试是finsihed percona_db服务之前启动phpfpm服务,并抛出一个错误说Percona的容器犯规存在:/。

我在做什么错? 或者我能做些什么来使它工作? (也许让phpfpm服务人为地等待?用systemd可以吗?)

谢谢!

+0

你有没有在'/ etc/systemd /系统/多user.target.wants'或两者'percona_db.service'和'php_fpm刚上市'php_fpm.service'。 service'。它应该没有关系,因为'php_fpm.service'中的'after = percona_db.service'应该控制它们在两个列表中都被启动的顺序,但是值得尝试从''percona_db.service''中删除' multi-user.target.wants'来查看是否会强制正确排序。 – 2014-09-26 06:31:30

你的percona_db是一个长时间运行的进程,所以systemd将fork一个子进程并让它运行,并假设一切都很好,然后继续开始php_fpm。

这对于很多服务也很常见,即在应用程序实际准备好之前返回的启动脚本。最好的方法是编写一个程序来检查percona_db的状态,它会一直等到percona_db准备好,然后在你的php_fpm服务文件中添加一行ExecStartPre = <your_check_program> .. ..

每个.service文件都有一个Type = [1]字段。 Type =字段告诉systemd什么时候它应该接受你的服务已经准备好,以便它可以开始后续服务。

您尚未在[服务]部分的服务文件中指定Type =。由于systemd设置了Type = simple的默认类型。在简单情况下,systemd将启动用ExecStart指定的进程并假定所有进程都会正确运行。此时systemd认为您的服务已准备就绪。

你会想在你的percona_db.service中设置Type = oneshot。

[1] - http://www.freedesktop.org/software/systemd/man/systemd.service.html