系统在开始下一个之前不等我的服务单位完成

这是我的两个单位:

- 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启动的docker容器有时需要很长时间才能加载(如果是第一次加载,它会创builddb并添加数据,这可能需要一些时间)。 php_fpm服务需要percona服务来启动,因为我将它们链接在一起。 而且,即使我指定:

  After=percona_db.service Requires=percona_db.service 

systemd尝试在percona_db服务被刷新之前启动phpfpm服务,并抛出一个错误,说percona容器不存在:/。

我究竟做错了什么? 或者我能做些什么来使其工作? (也许使phpfpm服务等待人为?可以用systemd吗?)

谢谢 !

你的percona_db是一个长时间运行的进程,所以systemd会分叉一个subprocess并让它运行,并假设一切正常,然后继续启动php_fpm。

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

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

您没有在[服务]部分的服务文件中指定Type =。 因为systemd设置了Type = simple的默认types。 在简单情况下,systemd将启动您的ExecStart指定的进程,并假设所有进程都会正确。 此时systemd认为你的服务已经准备就绪。

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

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