Linux

每天執行一次 systemd 服務(在 CoreOS 集群上)

  • June 4, 2015

我目前在 AWS 上有一個 CoreOS 集群。集群執行多個容器,主要用於 Rails 應用程序。但是,其中一個容器是一個純 Ruby 應用程序,它處理來自特定外部 API 的大量數據。

實際上,該應用程序的 Docker 容器每天在世界標準時間凌晨 4 點執行。

我的應用程序服務:

[Unit]
Description=MyApp service
Requires=docker.service

[Service]
ExecStart=/home/core/sc/myapp_start.sh
User=core

myapp.timer:

[Unit]
Description=MyApp Timer
Requires=docker.service

[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true

服務執行的shell腳本可以總結為:

/usr/bin/docker run --rm --name=myapp omg/myapp:$tag

由於容器是通過 CircleCI 部署到集群中的,因此容器可以位於集群中的其中一台伺服器上。但是,如果執行容器的伺服器由於另一個容器在同一伺服器上執行並佔用大量 RAM 而記憶體不足,或者如果磁碟上沒有可用空間等 - 那麼容器將停止並再次執行集群的另一台伺服器。

在該 Ruby 應用程序的上下文中,這有點問題,它應該每天只執行一次,並且在伺服器出現故障的情況下不能再次執行。

在那種情況下,我該如何進行?

謝謝你。

您需要教您的應用程序使用在容器重新啟動/移動後倖存下來的方法(可能是持久/共享文件系統上的文件、數據庫中的一些資訊、一些外部協調服務/應用程序等)來跟踪自己的執行情況 -任何對您的上下文方便的東西)。

重新啟動後,如果應用程序看到它已經在指定的時間間隔內執行,那麼它將直接退出而不做任何事情。如果需要,甚至可以教它拿起並完成以前未完成的工作:)

如果無法在應用程序內執行此操作,則可以將應用程序包裝在自定義包裝器中並在包裝器內執行。

引用自:https://unix.stackexchange.com/questions/207429