Buildroot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: unixmania at gmail.com <unixmania@gmail.com>
To: buildroot@busybox.net
Subject: [Buildroot] [PATCH v2] package/dcron: fix startup error due to missing directories
Date: Sun, 21 Jul 2019 21:24:25 -0300	[thread overview]
Message-ID: <20190722002425.6783-1-unixmania@gmail.com> (raw)

From: Carlos Santos <unixmania@gmail.com>

crond uses the /var/spool/cron/{crontabs,cronstamps} directories to
store the per-user crontabs and timestamps for jobs, respectively.

On systems with busybox or sysv init /var/spool is by default a link to
/tmp (see package/skeleton-init-sysv/skeleton/). So if those directories
are created at installation time they actually are under /tmp/spool and
vanish at run time when a tmpfs is mounted at /tmp. In this case crond
issues error messages that can't be seen.

The error is hidden because we use start-stop-daemon to run crond in
foreground mode to create a pid file and move crond to background. In
this mode crond does not use syslog and all error messages are lost
because start-stop-daemon redirects strderr to /dev/null.

Getting a presistent storage for /var/spool would require customisations
of the directory layout, which can not be done in a generic way, as each
one will need to adapt to their own constraints.

Fix these problem by means of the following changes:

- Add configs for the crontabs and cronstamps paths. They can be used to
  move the directories to persistent filesystems, if necessary.
- Change the init script and systemd unit to ensure that the directories
  are created before starting crond.
- Start crond in daemon mode in the init script and use "pidof crond" to
  create the required pid file.

Fixes: https://bugs.busybox.net/show_bug.cgi?id=12011

Signed-off-by: Carlos Santos <unixmania@gmail.com>
---
Changes v1->v2:
  - Remove (partially), since the fix is now complete
---
 package/dcron/Config.in     | 16 ++++++++++++++++
 package/dcron/S90dcron      |  8 +++++++-
 package/dcron/dcron.mk      | 11 +++++++++--
 package/dcron/dcron.service |  3 ++-
 4 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/package/dcron/Config.in b/package/dcron/Config.in
index d7f66bdb7d..1203c42dec 100644
--- a/package/dcron/Config.in
+++ b/package/dcron/Config.in
@@ -21,3 +21,19 @@ config BR2_PACKAGE_DCRON
 	  with sgid bit enabled.
 
 	  http://www.jimpryor.net/linux/dcron.html
+
+if BR2_PACKAGE_DCRON
+
+config BR2_PACKAGE_DCRON_CRONTABS_DIR
+	string "crontabs directory"
+	default "/var/spool/cron/crontabs"
+	help
+	  Directory of per-user crontabs
+
+config BR2_PACKAGE_DCRON_CRONSTAMPS_DIR
+	string "cronstamps directory"
+	default "/var/spool/cron/cronstamps"
+	help
+	  Directory of timestamps for @freq and FREQ=... jobs
+
+endif
diff --git a/package/dcron/S90dcron b/package/dcron/S90dcron
index de21d2ca13..4527277623 100644
--- a/package/dcron/S90dcron
+++ b/package/dcron/S90dcron
@@ -1,9 +1,15 @@
 #!/bin/sh
 
+CRONTABS_DIR=%%CRONTABS_DIR%%
+CRONSTAMPS_DIR=%%CRONSTAMPS_DIR%%
+
 case "$1" in
 	start)
 		printf "Starting cron ... "
-		start-stop-daemon -S -q -m -b -p /var/run/dcron.pid --exec /usr/sbin/crond -- -f
+		mkdir -p "$CRONTABS_DIR" "$CRONSTAMPS_DIR"
+		start-stop-daemon -S -q -p /var/run/dcron.pid -x /usr/sbin/crond \
+			-- -c "$CRONTABS_DIR" -t "$CRONSTAMPS_DIR"
+		pidof crond > /var/run/dcron.pid || rm -f /var/run/dcron.pid
 		echo "done."
 		;;
 	stop)
diff --git a/package/dcron/dcron.mk b/package/dcron/dcron.mk
index 2ee0709af5..453e3acb54 100644
--- a/package/dcron/dcron.mk
+++ b/package/dcron/dcron.mk
@@ -19,18 +19,25 @@ define DCRON_INSTALL_TARGET_CMDS
 	$(INSTALL) -D -m0644 $(@D)/extra/root.crontab $(TARGET_DIR)/etc/cron.d/system
 	# Busybox provides run-parts, so there is no need to use nor install provided run-cron
 	$(SED) 's#/usr/sbin/run-cron#/bin/run-parts#g' $(TARGET_DIR)/etc/cron.d/system
-	$(INSTALL) -d -m0755 $(TARGET_DIR)/var/spool/cron/crontabs \
-		$(TARGET_DIR)/etc/cron.daily $(TARGET_DIR)/etc/cron.hourly \
+	$(INSTALL) -d -m750 $(TARGET_DIR)/etc/cron.daily $(TARGET_DIR)/etc/cron.hourly \
 		$(TARGET_DIR)/etc/cron.monthly $(TARGET_DIR)/etc/cron.weekly
 endef
 
 define DCRON_INSTALL_INIT_SYSV
 	$(INSTALL) -D -m 0755 package/dcron/S90dcron $(TARGET_DIR)/etc/init.d/S90dcron
+	$(SED) 's#%%CRONTABS_DIR%%#$(BR2_PACKAGE_DCRON_CRONTABS_DIR)#' \
+		$(TARGET_DIR)/etc/init.d/S90dcron
+	$(SED) 's#%%CRONSTAMPS_DIR%%#$(BR2_PACKAGE_DCRON_CRONSTAMPS_DIR)#' \
+		$(TARGET_DIR)/etc/init.d/S90dcron
 endef
 
 define DCRON_INSTALL_INIT_SYSTEMD
 	$(INSTALL) -D -m 644 package/dcron/dcron.service \
 		$(TARGET_DIR)/usr/lib/systemd/system/dcron.service
+	$(SED) 's#%%CRONTABS_DIR%%#$(BR2_PACKAGE_DCRON_CRONTABS_DIR)#' \
+		$(TARGET_DIR)/usr/lib/systemd/system/dcron.service
+	$(SED) 's#%%CRONSTAMPS_DIR%%#$(BR2_PACKAGE_DCRON_CRONSTAMPS_DIR)#' \
+		$(TARGET_DIR)/usr/lib/systemd/system/dcron.service
 	mkdir -p $(TARGET_DIR)/etc/systemd/system/multi-user.target.wants
 	ln -sf ../../../../usr/lib/systemd/system/dcron.service \
 		$(TARGET_DIR)/etc/systemd/system/multi-user.target.wants/dcron.service
diff --git a/package/dcron/dcron.service b/package/dcron/dcron.service
index 924ed72205..abce25ba4f 100644
--- a/package/dcron/dcron.service
+++ b/package/dcron/dcron.service
@@ -3,7 +3,8 @@ Description=Task scheduler daemon
 After=syslog.target
 
 [Service]
-ExecStart=/usr/sbin/crond -S
+ExecStartPre=mkdir -p %%CRONTABS_DIR%% %%CRONSTAMPS_DIR%%
+ExecStart=/usr/sbin/crond -c %%CRONTABS_DIR%% -t %%CRONSTAMPS_DIR%%
 Type=forking
 
 [Install]
-- 
2.18.1

             reply	other threads:[~2019-07-22  0:24 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-22  0:24 unixmania at gmail.com [this message]
2019-07-22 15:46 ` [Buildroot] [PATCH v2] package/dcron: fix startup error due to missing directories Yann E. MORIN
2019-11-08 20:55 ` Yann E. MORIN

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190722002425.6783-1-unixmania@gmail.com \
    --to=unixmania@gmail.com \
    --cc=buildroot@busybox.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox