Cron quit working after 25.12 upgrade

The WRT1900ACv1 stock image ships an /etc/crontabs/root with these contents:

# mamba fan script runs once every five minutes
*/5 * * * * /sbin/fan_ctrl.sh

This used to work, but ever since I updated to 25.12 it no longer has any effect. I cranked the cron log level up as high as it will go and I see nothing helpful in the logs:

# uci set system.@system[0].cronloglevel="0"
# service cron restart
# ps w | grep [c]ron
 5288 root      1132 S    /usr/sbin/crond -f -c /etc/crontabs -l 0
# logread -f
Thu Jun  4 13:47:16 2026 cron.err crond[5288]: crond (busybox 1.37.0) started, log level 0
Thu Jun  4 13:48:00 2026 cron.err crond[5288]: wakeup dt=44
Thu Jun  4 13:49:00 2026 cron.err crond[5288]: wakeup dt=60
Thu Jun  4 13:50:00 2026 cron.err crond[5288]: wakeup dt=60
Thu Jun  4 13:51:00 2026 cron.err crond[5288]: wakeup dt=60
(...)

Running /sbin/fan_ctrl.sh manually from the shell prompt works fine (no errors, and the fan stops running full blast). Any idea what might be wrong here? I am really tired of listening to the fan noise but I don't want to just turn it off and leave it like that.

I was using the independent shell loop recipe from Logread, sbin/fan_ctrl.sh, wrt1900ac, dc502wrt - #2 by anomeome but owut erases that every time I run an update and I have to put it back, so if anyone knows how to make owut not do that, that'd be just as good an answer as one that fixes cron.

Tagging - @anomeome

Edit your /etc/sysupgrade.conf and go the end of the file. Add etc/init.d/fan_control and usr/sbin/fan_monitor. Save the edited /etc/sysupgrade.conf. That should:

  • Backup the Fan Control Function/Procd Script
  • Allow Owut to add them when you next upgrade.

Thanks. Do I also need to mention the /etc/rc.d/S65fan_control link, or is that automatically preserved because it links to a preserved file or something like that?

No. That’s a function of Procd.

I’m also seeing cron failure. In my case, the daily acme update
[3 Jun 2026 at 12:00:00 AM SGT] cron.err: crond[2596]: USER root pid 21729 cmd /etc/init.d/acme renew
[4 Jun 2026 at 12:00:00 AM SGT] cron.err: crond[2596]: USER root pid 30337 cmd /etc/init.d/acme renew
[5 Jun 2026 at 12:00:00 AM SGT] cron.err: crond[2596]: USER root pid 6462 cmd /etc/init.d/acme renew

Cron.err doesn't mean failure

Please see

Your logs show success, actually.

Thank you both for your swift reply

Ok, but in my case I am certain that the cron job is not actually getting run, because the fan keeps running at 100%. I think the cron-related log messages I'm getting with cron's internal log level cranked all the way up to 0,

Thu Jun  4 13:48:00 2026 cron.err crond[5288]: wakeup dt=44
Thu Jun  4 13:49:00 2026 cron.err crond[5288]: wakeup dt=60
Thu Jun  4 13:50:00 2026 cron.err crond[5288]: wakeup dt=60
Thu Jun  4 13:51:00 2026 cron.err crond[5288]: wakeup dt=60

mean that cron thinks it doesn't have anything to do. But the file /etc/crontabs/root exists, and it's part of the base system image, so someone other than me thought it would be honored... what gives?

What about permissions?

ls -l /etc/crontabs
ls -l /sbin/fan_ctrl.sh

Also try to notify cron of an update to the crontab:

echo 'root' >> /etc/crontabs/cron.update

Yesiree Bub, I figure you have encountered a fault in the BusyBox cron.

Just for giggles I set my Snapshot from "r34654+5-a302626ef4" (9-10 days ago) using this in my /etc/crontabs/root:
*/5 * * * * ntpdate 10.10.1.240
*/5 * * * * logger -t "cron executed"

I also set up my WRT1900ACS AP running a down version Release with the same entries.

Here are my results from both:

  • Snapshot Build
Thu Jun  4 18:17:45 2026 cron.err crond[7211]: crond (busybox 1.37.0) started, log level 0
Thu Jun  4 18:18:00 2026 cron.err crond[7211]: wakeup dt=15
Thu Jun  4 18:19:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:20:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:21:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:22:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:23:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:24:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:25:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:26:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:27:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:28:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:29:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:30:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:31:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:32:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:33:00 2026 cron.err crond[7211]: wakeup dt=60
Thu Jun  4 18:40:00 2026 cron.err crond[7211]: wakeup dt=60
  • Down version Release Build
Thu Jun  4 18:32:15 2026 cron.err crond[5510]: crond (busybox 1.36.1) started, log level 5
Thu Jun  4 18:35:00 2026 cron.err crond[5510]: USER root pid 5547 cmd ntpdate 10.10.1.240
Thu Jun  4 18:35:00 2026 cron.err crond[5510]: USER root pid 5548 cmd logger -t "cron executed"
Thu Jun  4 18:40:00 2026 cron.err crond[5510]: USER root pid 5553 cmd ntpdate 10.10.1.240
Thu Jun  4 18:40:00 2026 cron.err crond[5510]: USER root pid 5554 cmd logger -t "cron executed"
Thu Jun  4 18:45:00 2026 cron.err crond[5510]: USER root pid 5567 cmd ntpdate 10.10.1.240
Thu Jun  4 18:45:00 2026 cron.err crond[5510]: USER root pid 5568 cmd logger -t "cron executed"
Thu Jun  4 18:50:00 2026 cron.err crond[5510]: USER root pid 5572 cmd ntpdate 10.10.1.240
Thu Jun  4 18:50:00 2026 cron.err crond[5510]: USER root pid 5573 cmd logger -t "cron executed"
Thu Jun  4 18:55:00 2026 cron.err crond[5510]: USER root pid 5577 cmd ntpdate 10.10.1.240
Thu Jun  4 18:55:00 2026 cron.err crond[5510]: USER root pid 5578 cmd logger -t "cron executed"
Thu Jun  4 19:00:00 2026 cron.err crond[5510]: USER root pid 5598 cmd ntpdate 10.10.1.240
Thu Jun  4 19:00:00 2026 cron.err crond[5510]: USER root pid 5599 cmd logger -t "cron executed"

Behaves as expected on 25.12.4 for me with busybox 1.37.0.

Thu Jun  4 21:25:46 2026 cron.err crond[25713]: crond (busybox 1.37.0) started, log level 5
Thu Jun  4 21:25:46 2026 cron.err crond[25713]: user:root entry:(null)
Thu Jun  4 21:25:46 2026 cron.err crond[25713]: user:root entry:(null)
Thu Jun  4 21:26:00 2026 cron.err crond[25713]: user:root entry:(null)
Thu Jun  4 21:26:00 2026 cron.err crond[25713]: user:root entry:(null)
Thu Jun  4 21:26:00 2026 cron.err crond[25713]: wakeup dt=14
Thu Jun  4 21:26:00 2026 cron.err crond[25713]: file root:
Thu Jun  4 21:26:00 2026 cron.err crond[25713]:  line /etc/init.d/adblock reload
Thu Jun  4 21:26:00 2026 cron.err crond[25713]:  line logger -t "cron executed" test
Thu Jun  4 21:27:00 2026 cron.err crond[25713]: wakeup dt=60
Thu Jun  4 21:27:00 2026 cron.err crond[25713]: file root:
Thu Jun  4 21:27:00 2026 cron.err crond[25713]:  line /etc/init.d/adblock reload
Thu Jun  4 21:27:00 2026 cron.err crond[25713]:  line logger -t "cron executed" test
Thu Jun  4 21:28:00 2026 cron.err crond[25713]: wakeup dt=60
Thu Jun  4 21:28:00 2026 cron.err crond[25713]: file root:
Thu Jun  4 21:28:00 2026 cron.err crond[25713]:  line /etc/init.d/adblock reload
Thu Jun  4 21:28:00 2026 cron.err crond[25713]:  line logger -t "cron executed" test
Thu Jun  4 21:29:00 2026 cron.err crond[25713]: wakeup dt=60
Thu Jun  4 21:29:00 2026 cron.err crond[25713]: file root:
Thu Jun  4 21:29:00 2026 cron.err crond[25713]:  line /etc/init.d/adblock reload
Thu Jun  4 21:29:00 2026 cron.err crond[25713]:  line logger -t "cron executed" test
Thu Jun  4 21:30:00 2026 cron.err crond[25713]: wakeup dt=60
Thu Jun  4 21:30:00 2026 cron.err crond[25713]: file root:
Thu Jun  4 21:30:00 2026 cron.err crond[25713]:  line /etc/init.d/adblock reload
Thu Jun  4 21:30:00 2026 cron.err crond[25713]:  line logger -t "cron executed" test
Thu Jun  4 21:30:00 2026 cron.err crond[25713]:  job: 0 logger -t "cron executed" test
Thu Jun  4 21:30:00 2026 cron.err crond[26552]: child running /bin/ash
Thu Jun  4 21:30:00 2026 cron.err crond[25713]: USER root pid 26552 cmd logger -t "cron executed" test
Thu Jun  4 21:30:00 2026 user.notice cron executed: test

I am also on 25.12.4.

BusyBox v1.37.0 (2026-05-29 11:11:15 UTC) built-in shell (ash)

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 -----------------------------------------------------
 OpenWrt 25.12.4, r32933-4ccb782af7 Dave's Guitar
 -----------------------------------------------------
# ls -la /etc/crontabs
drwxr-xr-x    1 root     root           224 Dec 31  1969 .
drwxr-xr-x    1 root     root          1936 May 13 18:42 ..
-rw-r--r--    1 1000     1000           171 Jun  4 14:44 root

# ls -l /sbin/fan_ctrl.sh
-rwxr-xr-x    1 root     root           753 May 13 18:42 /sbin/fan_ctrl.sh

Seeing that, I thought maybe crontabs files need to be owned by the user they apply to, so I did chown root:root /etc/crontabs/root, but that did not change anything.

No effect. The cron.update file was deleted the next time cron woke up, but it still believes it has nothing to do.

Thu Jun  4 22:41:00 2026 cron.err crond[12550]: wakeup dt=60
Thu Jun  4 22:42:00 2026 cron.err crond[12550]: wakeup dt=60
Thu Jun  4 22:43:00 2026 cron.err crond[12550]: wakeup dt=60
Thu Jun  4 22:44:00 2026 cron.err crond[12550]: wakeup dt=60
Thu Jun  4 22:45:00 2026 cron.err crond[12550]: wakeup dt=60
Thu Jun  4 22:46:00 2026 cron.err crond[12550]: wakeup dt=60

Interesting. Mine is the same. Try chown root:root /etc/crontabs/root chmod 600 /etc/crontabs/root

Mysterious. Anything corrupt in the crontab?

cat /etc/crontabs/root
hexdump -C /etc/crontabs/root

Or, if you can install strace, run this command to see what it’s doing inside:

service cron stop
strace /usr/sbin/crond -f -c /etc/crontabs -l 5
service cron start

Another sanity check is to look at the root user entry in /etc/passwd. crond will read that also.

Anything corrupt in the crontab?

I don't see anything fishy...

root@shinynewrouter:~# cat /etc/crontabs/root
# mamba fan script runs once every five minutes
#*/5 * * * * /sbin/fan_ctrl.sh
* * * * * logger -p user.warn "cron executed"
root@shinynewrouter:~# hexdump -C /etc/crontabs/root
00000000  23 20 6d 61 6d 62 61 20  66 61 6e 20 73 63 72 69  |# mamba fan scri|
00000010  70 74 20 72 75 6e 73 20  6f 6e 63 65 20 65 76 65  |pt runs once eve|
00000020  72 79 20 66 69 76 65 20  6d 69 6e 75 74 65 73 0a  |ry five minutes.|
00000030  23 2a 2f 35 20 2a 20 2a  20 2a 20 2a 20 2f 73 62  |#*/5 * * * * /sb|
00000040  69 6e 2f 66 61 6e 5f 63  74 72 6c 2e 73 68 0a 2a  |in/fan_ctrl.sh.*|
00000050  20 2a 20 2a 20 2a 20 2a  20 6c 6f 67 67 65 72 20  | * * * * logger |
00000060  2d 70 20 75 73 65 72 2e  77 61 72 6e 20 22 63 72  |-p user.warn "cr|
00000070  6f 6e 20 65 78 65 63 75  74 65 64 22 0a           |on executed".|
0000007d

Curiously, however, I restarted cron again (to crank up the log level again) and now it's actually working!

Fri Jun  5 09:33:12 2026 cron.err crond[23804]: crond (busybox 1.37.0) started, log level 0
Fri Jun  5 09:33:12 2026 cron.err crond[23804]: user:root entry:(null)
Fri Jun  5 09:34:00 2026 cron.err crond[23804]: user:root entry:(null)
Fri Jun  5 09:34:00 2026 cron.err crond[23804]: wakeup dt=48
Fri Jun  5 09:34:00 2026 cron.err crond[23804]: file root:
Fri Jun  5 09:34:00 2026 cron.err crond[23804]:  line logger -p user.warn "cron executed"
Fri Jun  5 09:34:00 2026 cron.err crond[23804]:  job: 0 logger -p user.warn "cron executed"
Fri Jun  5 09:34:00 2026 cron.err crond[23840]: child running /bin/ash
Fri Jun  5 09:34:00 2026 cron.err crond[23804]: USER root pid 23840 cmd logger -p user.warn "cron executed"
Fri Jun  5 09:34:00 2026 user.warn root: cron executed
Fri Jun  5 09:34:10 2026 cron.err crond[23804]: wakeup dt=10
Fri Jun  5 09:35:00 2026 cron.err crond[23804]: wakeup dt=50
Fri Jun  5 09:35:00 2026 cron.err crond[23804]: file root:
Fri Jun  5 09:35:00 2026 cron.err crond[23804]:  line logger -p user.warn "cron executed"
Fri Jun  5 09:35:00 2026 cron.err crond[23804]:  job: 0 logger -p user.warn "cron executed"
Fri Jun  5 09:35:00 2026 cron.err crond[23853]: child running /bin/ash
Fri Jun  5 09:35:00 2026 cron.err crond[23804]: USER root pid 23853 cmd logger -p user.warn "cron executed"
Fri Jun  5 09:35:00 2026 user.warn root: cron executed
Fri Jun  5 09:35:09 2026 cron.err crond[23901]: crond (busybox 1.37.0) started, log level 7
Fri Jun  5 09:36:00 2026 cron.err crond[23901]: USER root pid 23934 cmd logger -p user.warn "cron executed"
Fri Jun  5 09:36:00 2026 user.warn root: cron executed
Fri Jun  5 09:37:00 2026 cron.err crond[23901]: USER root pid 23955 cmd logger -p user.warn "cron executed"
Fri Jun  5 09:37:00 2026 user.warn root: cron executed

My best guess is that the problem was that root didn't own the file, and last night it didn't occur to me to restart the daemon after changing the file permissions, but restarting it for some other reason made it notice that root owns the file now.

If that's right, the bug is that busybox cron silently ignores non-root-owned files in /etc/crontabs even with the log level cranked up as far as it will go. It should instead log a warning message about ignoring each such file.

Yes, it seems to ignore any crontab file not owned by root.

That seems to be the right place so I filed https://github.com/vda-linux/busybox_mirror/issues/11 about this.