Portál AbcLinuxu, 30. dubna 2025 10:18
Kdysi dávno (před více než pěti lety) jsem hledal způsob, jak spustit nějaký příkaz po restartu systému jako běžný uživatel - ne root. Nic čistého jsem nenašel a tak jsem dal do cronu "každých 10 minut kontroluj, jestli běží proces a kdyžtak ho nahoď". Pak jsem se stal rootem a naučil se psát rc scripty, ale teď se dívám do manuálu od cronu a co nevidím:
[...] Instead of the first five fields, one of eight special strings may appear: string meaning ------ ------- @reboot Run once, at startup. [...]
To řeší hned dva problémy. Jednak uživatel nepotřebuje být rootem, aby se dostal k této "službě" a druhak to řeší můj problém s Debianem. Ten totož neobsahuje (aspoň co já vím) žádný evivalent něčeho jako je /etc/rc.local, kam ve své Fedoře dávám všechno, co mi nestojí za psaní rc scriptu.
Teď jenom doufám, že jsem neobjevil kolo.
Tiskni
Sdílej:
Navíc se dokumentace nezmiňuje, jak crond
pozná, že byl opravdu spuštěn v rámci inicializačních skriptů po startu systému a ne ručně později. To mi připadá dost důležité.
Navíc se dokumentace nezmiňuje, jak crond
pozná, že byl opravdu spuštěn v rámci inicializačních skriptů po startu systému a ne ručně později. To mi připadá dost důležité.
Na implementaciu som sa nepozeral, ale nepise si to crond niekde do /var/... ? run_reboot_jobs(db) cron_db *db; { register user *u; register entry *e; int rbfd; #ifdef DEBIAN #define REBOOT_FILE "/var/run/crond.reboot" /* Run on actual reboot, rather than cron restart */ if (access(REBOOT_FILE, F_OK) == 0) { /* File exists, return */ log_it("CRON", getpid(),"INFO", "Skipping @reboot jobs -- not system startup"); return; } /* Create the file */ if ((rbfd = creat(REBOOT_FILE, S_IRUSR&S_IWUSR)) < 0) { /* Bad news, bail out */ log_it("CRON",getpid(),"DEATH","Can't create reboot check file") ; exit(0); } else { close(rbfd); log_it("CRON", getpid(),"INFO", "Running @reboot jobs"); } Debug(DMISC, ("[%d], Debian running reboot jobs\n",getpid())); #endif Debug(DMISC, ("[%d], vixie running reboot jobs\n", getpid())); for (u = db->head; u != NULL; u = u->next) { for (e = u->crontab; e != NULL; e = e->next) { if (e->flags & WHEN_REBOOT) { job_add(e, u); } } } (void) job_runqueue(); }Z toho mi vychází, že pokud cron není v Debianu, tak spustí reboot jobs vždycky a pokud je, tak si to hlídá vytvořením souboru /var/run/crond.reboot, který mu zřejmě debianí rc.init někde smaže. Tato modicikace je součástí debianího diffu. Taky je možné, že si to na jiných systémech hlídá jinak podobně.
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.