cron locking

This commit is contained in:
Joey Hess 2014-04-17 19:43:12 -04:00
parent 7f8dc2425d
commit e1b96860bf
2 changed files with 14 additions and 4 deletions

View File

@ -3,14 +3,19 @@ module Propellor.Property.Cron where
import Propellor import Propellor
import qualified Propellor.Property.File as File import qualified Propellor.Property.File as File
import qualified Propellor.Property.Apt as Apt import qualified Propellor.Property.Apt as Apt
import Utility.SafeCommand
import Data.Char import Data.Char
type CronTimes = String type CronTimes = String
-- | Installs a cron job, run as a specificed user, in a particular -- | Installs a cron job, run as a specified user, in a particular
--directory. Note that the Desc must be unique, as it is used for the -- directory. Note that the Desc must be unique, as it is used for the
--cron.d/ filename. -- cron.d/ filename.
--
-- Only one instance of the cron job is allowed to run at a time, no matter
-- how long it runs. This is accomplished using flock locking of the cron
-- job file.
job :: Desc -> CronTimes -> UserName -> FilePath -> String -> Property job :: Desc -> CronTimes -> UserName -> FilePath -> String -> Property
job desc times user cddir command = cronjobfile `File.hasContent` job desc times user cddir command = cronjobfile `File.hasContent`
[ "# Generated by propellor" [ "# Generated by propellor"
@ -18,11 +23,14 @@ job desc times user cddir command = cronjobfile `File.hasContent`
, "SHELL=/bin/sh" , "SHELL=/bin/sh"
, "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" , "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
, "" , ""
, times ++ "\t" ++ user ++ "\t" ++ "cd " ++ cddir ++ " && " ++ command , times ++ "\t" ++ user ++ "\t"
++ "flock -n " ++ shellEscape cronjobfile
++ " -c sh -c " ++ shellEscape cmdline
] ]
`requires` Apt.serviceInstalledRunning "cron" `requires` Apt.serviceInstalledRunning "cron"
`describe` ("cronned " ++ desc) `describe` ("cronned " ++ desc)
where where
cmdline = "cd " ++ cddir ++ " && " ++ command
cronjobfile = "/etc/cron.d/" ++ map sanitize desc cronjobfile = "/etc/cron.d/" ++ map sanitize desc
sanitize c sanitize c
| isAlphaNum c = c | isAlphaNum c = c

2
debian/changelog vendored
View File

@ -8,6 +8,8 @@ propellor (0.3.1) UNRELEASED; urgency=medium
* Properties can now be satisfied differently on different operating * Properties can now be satisfied differently on different operating
systems. systems.
* Standard apt configuration for stable now includes backports. * Standard apt configuration for stable now includes backports.
* Cron jobs generated by propellor use flock(1) to avoid multiple
instances running at a time.
-- Joey Hess <joeyh@debian.org> Fri, 11 Apr 2014 15:00:11 -0400 -- Joey Hess <joeyh@debian.org> Fri, 11 Apr 2014 15:00:11 -0400