2014-09-26 26 views
2

這裏是我的兩個單元之前完成: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

回答

7

你的percona_db是一個長時間運行的進程,所以systemd將fork一個子進程並讓它運行,並假設一切都很好,然後繼續開始php_fpm。

這對於很多服務也很常見,即在應用程序實際準備好之前返回的啓動腳本。最好的方法是編寫一個程序來檢查percona_db的狀態,它會一直等到percona_db準備好,然後在你的php_fpm服務文件中添加一行ExecStartPre = <your_check_program> .. ..

3

每個.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

相關問題