Cov classic sau tias zoo siab teev tsis saib. Nyob rau lub sijhawm qus no tsis muaj programmers lossis Unix, tab sis niaj hnub programmers paub tseeb: cron yuav taug qab lub sijhawm hloov lawv.
Cov khoom siv kab hais kom ua yog ob qho tib si tsis muaj zog thiab ua haujlwm rau kuv. sed, awk, wc, txiav thiab lwm yam kev pabcuam qub yog khiav los ntawm cov ntawv sau ntawm peb cov servers txhua hnub. Ntau ntawm lawv tau tsim los ua cov haujlwm rau cron, lub sijhawm teem sijhawm los ntawm 70s.
Tau ntev kuv siv cron superficially, tsis mus rau hauv cov ntsiab lus, tab sis muaj ib hnub, thaum kuv ntsib ib qho yuam kev thaum khiav ib tsab ntawv, kuv txiav txim siab mus saib nws kom huv si. Qhov no yog li cas tsab xov xwm no tshwm sim, thaum sau nws kuv tau paub txog POSIX crontab, cov kev xaiv tseem ceeb hauv kev faib Linux nrov thiab cov qauv ntawm qee qhov ntawm lawv.
Puas yog koj siv Linux thiab ua haujlwm cron? Koj puas txaus siab rau qhov system thov architecture hauv Unix? Ces peb nyob ntawm peb txoj kev!
Kev ua tiav txhua lub sijhawm ntawm cov neeg siv lossis cov kev pabcuam system yog qhov tsim nyog pom tseeb hauv txhua qhov kev khiav haujlwm. Yog li ntawd, cov programmers paub txog qhov xav tau ntawm cov kev pabcuam uas tso cai rau lawv los ua haujlwm hauv nruab nrab thiab ua haujlwm ntev dhau los.
Unix-zoo li kev khiav hauj lwm systems taug qab lawv cov keeb kwm rov qab mus rau Version 7 Unix, tsim nyob rau hauv lub 70s ntawm lub xyoo pua xeem ntawm Bell Labs, suav nrog los ntawm nto moo Ken Thompson. Version 7 Unix kuj suav nrog cron, ib qho kev pabcuam rau kev ua haujlwm tsis tu ncua superuser.
Ib tug niaj hnub cron yog ib tug yooj yim kev pab cuam, tab sis cov kev khiav hauj lwm algorithm ntawm tus thawj version yog txawm yooj yim: cov kev pab cuam sawv ib zaug ib feeb, nyeem ib lub rooj nrog cov dej num los ntawm ib cov ntaub ntawv (/etc/lib/crontab) thiab ua rau lub superuser cov haujlwm uas yuav tsum tau ua nyob rau lub sijhawm tam sim no.
Tom qab ntawd, txhim kho cov qauv ntawm cov kev pabcuam yooj yim thiab muaj txiaj ntsig tau muab nrog txhua qhov kev ua haujlwm zoo li Unix.
Cov lus piav qhia dav dav ntawm cov qauv crontab thiab cov ntsiab lus tseem ceeb ntawm kev siv hluav taws xob ua haujlwm tau suav nrog hauv tus qauv tseem ceeb ntawm Unix-zoo li kev khiav hauj lwm systems - POSIX - nyob rau hauv 1992, thiab yog li cron los ntawm tus txheej txheem de facto tau los ua tus qauv de jure.
Xyoo 1987, Paul Vixie, tau tshawb fawb Unix cov neeg siv txog lawv qhov kev xav tau rau cron, tau tso tawm lwm qhov ntawm daemon uas kho qee qhov teeb meem ntawm cov tsoos cron thiab nthuav dav cov syntax ntawm cov ntaub ntawv.
Los ntawm qhov thib peb version ntawm Vixie cron pib ua kom tau raws li POSIX cov cai, ntxiv rau, qhov kev zov me nyuam muaj daim ntawv tso cai ywj pheej, lossis tsis muaj ntawv tso cai txhua, tshwj tsis yog qhov xav tau hauv README: tus sau tsis muab kev lees paub, tus sau lub npe tsis tuaj yeem raug tshem tawm, thiab qhov kev zov me nyuam tsuas yog muag ua ke nrog qhov chaws. Cov kev cai no tau dhau los ua tau raws li cov hauv paus ntsiab lus ntawm cov software dawb uas tau txais kev nyiam nyob rau xyoo ntawd, yog li qee qhov tseem ceeb ntawm Linux kev faib tawm uas tau tshwm sim thaum ntxov 90s coj Vixie cron ua lawv qhov system ib qho thiab tseem tab tom tsim nws niaj hnub no.
Cia peb xub paub txog tus neeg siv khoom siv hluav taws xob crontab piav qhia hauv POSIX, tom qab ntawd peb yuav saib cov kab ke txuas ntxiv uas tau muab hauv Vixie cron thiab kev siv cov kev hloov pauv ntawm Vixie cron hauv Linux nrov. Thiab thaum kawg, cherry ntawm lub ncuav mog qab zib yog kev tsom xam ntawm cron daemon ntaus ntawv.
POSIX crontab
Yog tias tus thawj cron ib txwm ua haujlwm rau tus superuser, cov neeg ua haujlwm niaj hnub no feem ntau cuam tshuam nrog cov haujlwm ntawm cov neeg siv zoo tib yam, uas muaj kev nyab xeeb dua thiab yooj yim dua.
Crons tau muab los ua ib txheej ntawm ob qhov kev pab cuam: kev ua haujlwm tas li cron daemon thiab crontab utility muaj rau cov neeg siv. Cov tom kawg tso cai rau koj los kho cov rooj ua haujlwm tshwj xeeb rau txhua tus neeg siv hauv lub kaw lus, thaum lub daemon pib ua haujlwm los ntawm cov neeg siv thiab cov rooj ua haujlwm.
В POSIX txuj tus cwj pwm ntawm daemon tsis tau piav qhia nyob rau hauv ib txoj kev thiab tsuas yog cov neeg siv kev pab cuam yog formalized crontab. Lub hav zoov ntawm cov txheej txheem rau kev tso tawm cov neeg siv cov dej num yog, ntawm chav kawm, implied, tab sis tsis tau piav nyob rau hauv kom meej.
Los ntawm kev hu rau crontab utility, koj tuaj yeem ua plaub yam: kho tus neeg siv lub rooj ua haujlwm hauv tus editor, thauj lub rooj los ntawm cov ntaub ntawv, qhia lub rooj ua haujlwm tam sim no, thiab tshem tawm cov lus ua haujlwm. Piv txwv li cas crontab utility ua haujlwm:
crontab -e # редактировать таблицу задач
crontab -l # показать таблицу задач
crontab -r # удалить таблицу задач
crontab path/to/file.crontab # загрузить таблицу задач из файла
Thaum hu crontab -e tus editor uas teev nyob rau hauv tus txheej txheem ib puag ncig hloov pauv yuav raug siv EDITOR.
Cov dej num lawv tus kheej tau piav qhia hauv cov qauv hauv qab no:
# строки-комментарии игнорируются
#
# задача, выполняемая ежеминутно
* * * * * /path/to/exec -a -b -c
# задача, выполняемая на 10-й минуте каждого часа
10 * * * * /path/to/exec -a -b -c
# задача, выполняемая на 10-й минуте второго часа каждого дня и использующая перенаправление стандартного потока вывода
10 2 * * * /path/to/exec -a -b -c > /tmp/cron-job-output.log
Thawj tsib daim teb ntawm cov ntaub ntawv: feeb [1..60], teev [0..23], hnub ntawm lub hli [1..31], hli [1..12], hnub ntawm lub lis piam [0. .6], qhov twg 0 yog hnub Sunday. Qhov kawg, thib rau, daim teb yog ib txoj kab uas yuav raug coj los ntawm tus neeg txhais lus tus qauv.
Hauv thawj tsib lub teb, cov txiaj ntsig tuaj yeem sau tau cais los ntawm commas:
# задача, выполняемая в первую и десятую минуты каждого часа
1,10 * * * * /path/to/exec -a -b -c
Los yog nrog hyphen:
# задача, выполняемая в каждую из первых десяти минут каждого часа
0-9 * * * * /path/to/exec -a -b -c
Cov poj koob yawm txwv ntawm cov npe nrov cron variants yog Vixie cron 3.0pl1, qhia hauv comp.sources.unix mailing list hauv 1992. Peb yuav xav txog cov yam ntxwv tseem ceeb ntawm qhov version no kom ntxaws ntxiv.
Vixie cron los hauv ob txoj haujlwm (cron thiab crontab). Raws li ib txwm muaj, tus daemon yog lub luag haujlwm rau kev nyeem ntawv thiab ua haujlwm los ntawm lub system ua haujlwm lub rooj thiab cov rooj ua haujlwm ntawm tus neeg siv, thiab cov khoom siv hluav taws xob crontab yog lub luag haujlwm rau kho cov neeg siv cov ntxhuav.
Task table thiab configuration files
Lub rooj ua haujlwm superuser nyob hauv /etc/crontab. Lub syntax ntawm lub system rooj sib haum mus rau lub syntax ntawm Vixie cron, tshwj tsis yog hais tias lub thib rau kab nyob rau hauv nws qhia lub npe ntawm tus neeg siv nyob rau hauv uas nws sawv cev rau txoj hauj lwm yog launched:
Ib lub rooj tshiab syntax tau dhau los: piv txwv li, koj tuaj yeem teev hnub ntawm lub lim tiam lossis lub hli los ntawm lub npe (Mon, Tue, thiab lwm yam):
# Запускается ежеминутно по понедельникам и вторникам в январе
* * * Jan Mon,Tue /path/to/exec
Koj tuaj yeem qhia cov kauj ruam los ntawm cov haujlwm uas tau pib:
# Запускается с шагом в две минуты
*/2 * * * Mon,Tue /path/to/exec
Cov kauj ruam thiab ntu tuaj yeem sib xyaw:
# Запускается с шагом в две минуты в первых десять минут каждого часа
0-10/2 * * * * /path/to/exec
# Запускается после перезагрузки системы
@reboot /exec/on/reboot
# Запускается раз в день
@daily /exec/daily
# Запускается раз в час
@hourly /exec/daily
Qee qhov kev hloov pauv ib puag ncig (feem ntau yog SHELL thiab HOME) yog siv los ntawm cron nws tus kheej los ua haujlwm. Nov yog dab tsi siv bash es tsis txhob tus qauv sh los khiav kev cai ua haujlwm yuav zoo li:
SHELL=/bin/bash
HOME=/tmp/
# exec будет запущен bash-ем в /tmp/
* * * * * /path/to/exec
Thaum kawg, txhua qhov kev hloov pauv ib puag ncig tau teev tseg hauv lub rooj (siv los ntawm cron lossis xav tau los ntawm cov txheej txheem) yuav raug xa mus rau txoj haujlwm khiav.
Txhawm rau hloov cov ntaub ntawv, crontab siv tus editor teev tseg hauv VISUAL lossis EDITOR ib puag ncig hloov pauv. Yog tias ib puag ncig uas crontab tau khiav tsis muaj cov kev hloov pauv no, ces "/usr/ucb/vi" yog siv (ucb yog tej zaum University of California, Berkeley).
Tsis tshua pom, tab sis cov kev hloov pauv tau suav nrog qhov chaw ntawm cov ntaub ntawv teeb tsa thiab cov rooj ua haujlwm.
Cov neeg siv cov ntxhuav hauv Debian nyob hauv /var/spool/cron/crontabs directory, cov lus system tseem nyob ntawd - hauv /etc/crontab. Debian pob-cov rooj ua haujlwm tshwj xeeb tau muab tso rau hauv /etc/cron.d, los ntawm qhov twg cron daemon tau nyeem lawv. Tus neeg siv nkag mus tswj yog tswj los ntawm /etc/cron.allow thiab /etc/cron.deny cov ntaub ntawv.
Lub plhaub qub tseem yog /bin / sh, uas hauv Debian yog lub plhaub me me POSIX-raws li khiav ceev, launched yam tsis tau nyeem tej configuration (nyob rau hauv non-interactive hom).
Cron nws tus kheej nyob rau hauv qhov tseeb versions ntawm Debian yog launched ntawm systemd, thiab lub community launch configuration tuaj yeem pom hauv /lib/systemd/system/cron.service. Tsis muaj ib yam dab tsi tshwj xeeb hauv kev pabcuam kev teeb tsa; kev tswj hwm kev ua haujlwm yooj yim dua tuaj yeem ua tiav los ntawm ib puag ncig hloov pauv tau tshaj tawm ncaj qha hauv crontab ntawm txhua tus neeg siv.
cronie ntawm RedHat, Fedora thiab CentOS
cronie - diav rawg ntawm Vixie cron version 4.1. Raws li hauv Debian, cov syntax tsis tau hloov pauv, tab sis kev txhawb nqa rau PAM thiab SELinux, ua haujlwm hauv pawg, taug qab cov ntaub ntawv siv inotify thiab lwm yam nta tau ntxiv.
Lub neej ntawd configuration yog nyob rau hauv ib txwm qhov chaw: lub system rooj nyob rau hauv /etc/crontab, tej pob khoom muab lawv cov ntxhuav nyob rau hauv /etc/cron.d, cov neeg siv cov ntxhuav mus rau hauv /var/spool/cron/crontabs.
Lub daemon khiav hauv kev tswj hwm kev tswj hwm, qhov kev pabcuam teeb tsa yog /lib/systemd/system/crond.service.
Ntawm Red Hat-zoo li kev faib tawm, /bin / sh yog siv los ntawm lub neej ntawd thaum pib, uas yog tus qauv bash. Nws yuav tsum raug sau tseg tias thaum ua haujlwm cron ntawm /bin / sh, lub plhaub bash pib hauv POSIX-raws li hom thiab tsis nyeem ib qho kev teeb tsa ntxiv, khiav hauv hom tsis sib tham.
cronie hauv SLES thiab openSUSE
Lub German faib SLES thiab nws cov derivative openSUSE siv tib cronie. Lub daemon ntawm no kuj tau pib nyob rau hauv systemd, qhov kev pab cuam teeb tsa nyob rau hauv /usr/lib/systemd/system/cron.service. Configuration: /etc/crontab, /etc/cron.d, /var/spool/cron/tabs. /bin/sh yog tib yam bash khiav hauv POSIX-raws li hom tsis sib tham.
Vixie cron ntaus ntawv
Cov xeeb leej xeeb ntxwv niaj hnub ntawm cron tsis tau hloov pauv radically piv rau Vixie cron, tab sis tseem tau txais cov yam ntxwv tshiab uas tsis tas yuav nkag siab cov ntsiab lus ntawm qhov kev zov me nyuam. Ntau qhov kev txuas ntxiv no tsis zoo tsim thiab tsis meej pem cov cai. Tus thawj cron qhov chaws los ntawm Paul Vixey yog qhov txaus siab nyeem.
Txoj kev default tau teeb tsa, uas yuav raug siv thaum pib cov txheej txheem:
setenv("PATH", _PATH_DEFPATH, 1);
Ces tus txheej txheem yog "daemonized": nws tsim ib tug me nyuam daim qauv ntawm tus txheej txheem los ntawm kev hu rau rab rawg thiab ib tug tshiab kev sib kho nyob rau hauv tus txheej txheem ntawm tus me nyuam (hu rau setsid). Cov txheej txheem niam txiv tsis xav tau lawm, thiab nws tawm:
switch (fork()) {
case -1:
/* критическая ошибка и завершение работы */
exit(0);
break;
case 0:
/* дочерний процесс */
(void) setsid();
break;
default:
/* родительский процесс завершает работу */
_exit(0);
}
Kev txiav tawm ntawm cov txheej txheem niam txiv tso lub xauv ntawm cov ntaub ntawv xauv. Tsis tas li ntawd, nws yuav tsum tau hloov kho PID hauv cov ntaub ntawv rau tus menyuam. Tom qab ntawd, cov ntaub ntawv ua haujlwm tau sau rau hauv:
Tom qab ntawd cron txav mus rau lub voj voog ua haujlwm tseem ceeb. Tab sis ua ntej ntawd, nws tsim nyog ua tib zoo saib ntawm kev thauj cov npe ua haujlwm.
Sau thiab hloov kho cov npe ua haujlwm
Lub load_database muaj nuj nqi yog lub luag haujlwm rau thauj cov npe ntawm cov haujlwm. Nws xyuas lub ntsiab system crontab thiab cov npe nrog cov neeg siv cov ntaub ntawv. Yog tias cov ntaub ntawv thiab cov npe tsis tau hloov pauv, daim ntawv teev cov haujlwm yuav tsis rov nyeem dua. Txwv tsis pub, ib daim ntawv teev cov haujlwm tshiab pib tsim.
Loading a system file nrog cov ntaub ntawv tshwj xeeb thiab cov npe ntawm lub rooj:
/* если файл системной таблицы изменился, перечитываем */
if (syscron_stat.st_mtime) {
process_crontab("root", "*system*",
SYSCRONTAB, &syscron_stat,
&new_db, old_db);
}
Loading user tables nyob rau hauv ib lub voj:
while (NULL != (dp = readdir(dir))) {
char fname[MAXNAMLEN+1],
tabname[MAXNAMLEN+1];
/* читать файлы с точкой не надо*/
if (dp->d_name[0] == '.')
continue;
(void) strcpy(fname, dp->d_name);
sprintf(tabname, CRON_TAB(fname));
process_crontab(fname, fname, tabname,
&statbuf, &new_db, old_db);
}
Tom qab ntawd cov ntaub ntawv qub tau hloov nrog ib qho tshiab.
Hauv cov piv txwv saum toj no, process_crontab muaj nuj nqi hu xov tooj xyuas tias tus neeg siv sib piv cov ntaub ntawv lub npe muaj nyob (tshwj tsis yog nws yog superuser) thiab tom qab ntawd hu rau load_user. Lub tom kawg twb nyeem cov ntaub ntawv nws tus kheej kab los ntawm kab:
while ((status = load_env(envstr, file)) >= OK) {
switch (status) {
case ERR:
free_user(u);
u = NULL;
goto done;
case FALSE:
e = load_entry(file, NULL, pw, envp);
if (e) {
e->next = u->crontab;
u->crontab = e;
}
break;
case TRUE:
envp = env_set(envp, envstr);
break;
}
}
Ntawm no, ob qho tib si ib puag ncig hloov pauv tau teeb tsa (kab ntawm daim ntawv VAR = tus nqi) siv cov haujlwm load_env / env_set, lossis cov lus piav qhia ua haujlwm tau nyeem (* * * * * /path/to/exec) siv cov haujlwm load_entry.
Lub chaw nkag uas load_entry rov qab yog peb txoj haujlwm, uas tau muab tso rau hauv cov npe ntawm cov haujlwm. Qhov kev ua haujlwm nws tus kheej ua tawm qhov kev sib piv ntawm lub sijhawm, tab sis peb xav paub ntau ntxiv txog kev tsim cov kev hloov pauv ib puag ncig thiab cov haujlwm tso tawm tsis ua haujlwm:
/* пользователь и группа для запуска задачи берутся из passwd*/
e->uid = pw->pw_uid;
e->gid = pw->pw_gid;
/* шелл по умолчанию (/bin/sh), если пользователь не указал другое */
e->envp = env_copy(envp);
if (!env_get("SHELL", e->envp)) {
sprintf(envstr, "SHELL=%s", _PATH_BSHELL);
e->envp = env_set(e->envp, envstr);
}
/* домашняя директория */
if (!env_get("HOME", e->envp)) {
sprintf(envstr, "HOME=%s", pw->pw_dir);
e->envp = env_set(e->envp, envstr);
}
/* путь для поиска программ */
if (!env_get("PATH", e->envp)) {
sprintf(envstr, "PATH=%s", _PATH_DEFPATH);
e->envp = env_set(e->envp, envstr);
}
/* имя пользовтеля всегда из passwd */
sprintf(envstr, "%s=%s", "LOGNAME", pw->pw_name);
e->envp = env_set(e->envp, envstr);
Lub voj tseem ceeb ua haujlwm nrog cov npe ntawm cov haujlwm tam sim no.
Main voj
Thawj cron los ntawm Version 7 Unix ua haujlwm yooj yim heev: nws rov nyeem qhov teeb tsa hauv lub voj voog, pib ua haujlwm ntawm feeb tam sim no ua tus superuser, thiab pw kom txog thaum pib ntawm feeb tom ntej. Txoj hauv kev yooj yim no ntawm cov tshuab qub yuav tsum tau siv ntau dhau.
Ib qho kev hloov tshiab tau npaj rau hauv SysV, uas tus daemon tau pw tsaug zog mus txog rau lub sijhawm ze tshaj plaws uas lub luag haujlwm tau hais tseg, lossis rau 30 feeb. Cov peev txheej tsawg dua tau siv rau rov nyeem cov teeb tsa thiab tshuaj xyuas cov haujlwm hauv hom no, tab sis hloov kho cov npe ntawm cov haujlwm sai sai ua tsis yooj yim.
/* первичная загрузка задач */
load_database(&database);
/* запустить задачи, поставленные к выполнению после перезагрузки системы */
run_reboot_jobs(&database);
/* сделать TargetTime началом ближайшей минуты */
cron_sync();
while (TRUE) {
/* выполнить задачи, после чего спать до TargetTime с поправкой на время, потраченное на задачи */
cron_sleep();
/* перечитать конфигурацию */
load_database(&database);
/* собрать задачи для данной минуты */
cron_tick(&database);
/* перевести TargetTime на начало следующей минуты */
TargetTime += 60;
}
Lub cron_sleep muaj nuj nqi yog koom ncaj qha rau hauv kev ua haujlwm, hu rau job_runqueue (numerate thiab khiav haujlwm) thiab do_command (khiav txhua tus neeg ua haujlwm) ua haujlwm. Lub luag haujlwm kawg yog tsim nyog kuaj xyuas kom meej ntxiv.
Ua haujlwm
Lub do_command muaj nuj nqi tau ua tiav hauv Unix style zoo, uas yog, nws ua rab rawg los ua haujlwm asynchronously. Cov txheej txheem niam txiv tseem tab tom pib ua haujlwm, cov txheej txheem menyuam yaus npaj cov txheej txheem ua haujlwm:
switch (fork()) {
case -1:
/*не смогли выполнить fork */
break;
case 0:
/* дочерний процесс: на всякий случай еще раз пробуем захватить главный лок */
acquire_daemonlock(1);
/* переходим к формированию процесса задачи */
child_process(e, u);
/* по завершению дочерний процесс заканчивает работу */
_exit(OK_EXIT);
break;
default:
/* родительский процесс продолжает работу */
break;
}
Muaj ntau lub logic hauv child_process: nws lees txais cov qauv tsim tawm thiab cov kev ua yuam kev, tom qab ntawd xa lawv mus rau xa ntawv (yog tias MAILTO ib puag ncig hloov pauv tau teev tseg hauv cov lus ua haujlwm), thiab, thaum kawg, tos rau cov txheej txheem tseem ceeb ntawm txoj haujlwm. ua kom tiav.
Cov txheej txheem ua haujlwm yog tsim los ntawm lwm tus diav rawg:
switch (vfork()) {
case -1:
/* при ошибки сразу завершается работа */
exit(ERROR_EXIT);
case 0:
/* процесс-внук формирует новую сессию, терминал и т.д.
*/
(void) setsid();
/*
* дальше многословная настройка вывода процесса, опустим для краткости
*/
/* смена директории, пользователя и группы пользователя,
* то есть процесс больше не суперпользовательский
*/
setgid(e->gid);
setuid(e->uid);
chdir(env_get("HOME", e->envp));
/* запуск самой команды
*/
{
/* переменная окружения SHELL указывает на интерпретатор для запуска */
char *shell = env_get("SHELL", e->envp);
/* процесс запускается без передачи окружения родительского процесса,
* то есть именно так, как описано в таблице задач пользователя */
execle(shell, shell, "-c", e->cmd, (char *)0, e->envp);
/* ошибка — и процесс на запустился? завершение работы */
perror("execl");
_exit(ERROR_EXIT);
}
break;
default:
/* сам процесс продолжает работу: ждет завершения работы и вывода */
break;
}
Cron yog qhov kev pabcuam yooj yim thiab muaj txiaj ntsig zoo, ua hauv cov kab ke zoo tshaj plaws ntawm Unix ntiaj teb. Nws tsis ua dab tsi ntxiv, tab sis nws tau ua nws txoj haujlwm zoo kawg nkaus rau ntau xyoo tam sim no. Tau txais los ntawm cov cai rau lub version uas los nrog Ubuntu siv tsis pub dhau ib teev, thiab kuv muaj kev lom zem heev! Kuv vam tias kuv tuaj yeem qhia rau koj.
Kuv tsis paub txog koj, tab sis kuv tu siab me ntsis kom paub tias kev ua haujlwm niaj hnub no, nrog rau nws txoj kev xav kom nyuaj thiab dhau-abstract, tsis tau ua kom yooj yim rau lub sijhawm ntev.
Muaj ntau ntau txoj hauv kev niaj hnub no rau cron: systemd-timers tso cai rau koj los npaj cov txheej txheem nyuaj nrog kev vam khom, fcron tso cai rau koj kom tswj tau cov peev txheej ntau dua los ntawm kev ua haujlwm. Tab sis tus kheej, qhov yooj yim crontab yeej ib txwm txaus rau kuv.