In your dreams.
> here is a simple patch to replace /etc/crontab by /etc/cron.d/. > You need to manually mkdir /etc/cron.d. > > > --- pathnames_original.h Mon Apr 7 22:31:53 2014 > +++ pathnames.h Tue Apr 8 16:12:30 2014 > @@ -92,8 +92,8 @@ > #define PIDFILE "cron.pid" > #define _PATH_CRON_PID PIDDIR PIDFILE > > - /* 4.3BSD-style crontab */ > -#define SYSCRONTAB "/etc/crontab" > + /* system crontab dir */ > +#define SYSCRON_DIR "/etc/cron.d" > > /* what editor to use if no EDITOR or VISUAL > * environment variable specified. > @@ -42,30 +42,31 @@ > > Debug(DLOAD, ("[%ld] load_database()\n", (long)getpid())) > > - /* before we start loading any data, do a stat on SPOOL_DIR > - * so that if anything changes as of this moment (i.e., before > we've > - * cached any of the database), we'll see the changes next time. > + /* before we start loading any data, do a stat on SPOOL_DIR and > + * SYSCRON_DIR so that if anything changes as of this moment > + * (i.e., before we've cached any of the database), we'll see > + * the changes next time. > */ > if (stat(SPOOL_DIR, &statbuf) < OK) { > log_it("CRON", getpid(), "STAT FAILED", SPOOL_DIR); > return; > } > > - /* track system crontab file > - */ > - if (stat(SYSCRONTAB, &syscron_stat) < OK) > - syscron_stat.st_mtime = 0; > + if (stat(SYSCRON_DIR, &syscron_stat) < OK) { > + log_it("CRON", getpid(), "STAT FAILED", SYSCRON_DIR); > + return; > + } > > - /* if spooldir's mtime has not changed, we don't need to fiddle > with > - * the database. > + /* if spooldir's and syscrondir's mtime has not changed, we > don't > + * need to fiddle with the database. > * > * Note that old_db->mtime is initialized to 0 in main(), and > * so is guaranteed to be different than the stat() mtime the > first > * time this function is called. > */ > if (old_db->mtime == HASH(statbuf.st_mtime, > syscron_stat.st_mtime)) { > - Debug(DLOAD, ("[%ld] spool dir mtime unch, no load > needed.\n", > - (long)getpid())) > + Debug(DLOAD, ("[%ld] spool dirs mtime unch, no load > needed.\n", > + (long)getpid())) > return; > } > > @@ -77,28 +78,45 @@ > new_db.mtime = HASH(statbuf.st_mtime, syscron_stat.st_mtime); > new_db.head = new_db.tail = NULL; > > - if (syscron_stat.st_mtime) { > - process_crontab(ROOT_USER, NULL, SYSCRONTAB, > &syscron_stat, > - &new_db, old_db); > - } > - > /* we used to keep this dir open all the time, for the sake of > * efficiency. however, we need to close it in every fork, and > * we fork a lot more often than the mtime of the dir changes. > */ > - if (!(dir = opendir(SPOOL_DIR))) { > - log_it("CRON", getpid(), "OPENDIR FAILED", SPOOL_DIR); > + if (!(dir = opendir(SYSCRON_DIR))) { > + log_it("CRON", getpid(), "OPENDIR FAILED", SYSCRON_DIR); > return; > } > > - while (NULL != (dp = readdir(dir))) { > - char fname[MAXNAMLEN+1], tabname[MAXNAMLEN]; > + char fname[MAXNAMLEN+1], tabname[MAXNAMLEN]; > > + while (NULL != (dp = readdir(dir))) { > /* avoid file names beginning with ".". this is good > * because we would otherwise waste two guaranteed calls > * to getpwnam() for . and .., and also because user > names > * starting with a period are just too nasty to > consider. > */ > + if (dp->d_name[0] == '.') > + continue; > + > + if (strlcpy(fname, dp->d_name, sizeof fname) >= sizeof > fname) > + continue; /* XXX log? */ > + > + if (snprintf(tabname, sizeof tabname, "%s/%s", > SYSCRON_DIR, > + fname) >= sizeof(tabname)) > + continue; /* XXX log? */ > + > + process_crontab(ROOT_USER, NULL, tabname, &syscron_stat, > + &new_db, old_db); > + } > + > + closedir(dir); > + > + if (!(dir = opendir(SPOOL_DIR))) { > + log_it("CRON", getpid(), "OPENDIR FAILED", SPOOL_DIR); > + return; > + } > + > + while (NULL != (dp = readdir(dir))) { > if (dp->d_name[0] == '.') > continue; > > > --- cron_original.8 Mon Apr 7 22:31:53 2014 > +++ cron.8 Tue Apr 8 16:12:30 2014 > @@ -71,9 +71,8 @@ > commands. > Additionally, > .Nm > -checks the modification time on the system crontab file > -.Pq Pa /etc/crontab , > -the crontab spool > +checks the modification time on the crontab spool dirs > +.Pq Pa /etc/cron.d, > .Pq Pa /var/cron/tabs , > and the at spool > .Pq Pa /var/cron/atjobs > @@ -187,8 +186,8 @@ > .El > .Sh FILES > .Bl -tag -width "/var/cron/tabs/.sock" -compact > -.It Pa /etc/crontab > -system crontab file > +.It Pa /etc/cron.d > +system crontab directory > .It Pa /var/cron/atjobs > directory containing > .Xr at 1 > @@ -217,6 +216,9 @@ > For user crontab files created by > .Xr crontab 1 , > the mode must be 0400 or 0600. > -If the system crontab file is used, > -.Pa /etc/crontab > -must not be writable by any user other than root. > +If the system crontab spool dir is used, > +.Pa /etc/cron.d > +files inside must not be writable by any user other than root. > +Files inside the system crontab directory > +.Pa /etc/cron.d > +will be ignored if they start by a dot (.). > > > --- crontab_original.5 Tue Apr 8 16:33:54 2014 > +++ crontab.5 Tue Apr 8 16:22:27 2014 > @@ -279,7 +279,7 @@ > .El > .Sh FILES > .Bl -tag -width "/var/cron/tabs/<user>XXX" -compact > -.It Pa /etc/crontab > +.It Pa /etc/cron.d > System crontab. > .It Pa /var/cron/tabs/ Ns Aq Ar user > User crontab.