[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/cron-errors-troubleshooting":3,"mdc-qlu1ii-key":602,"mdc--33kc34-key":643,"mdc-qn8yny-key":666,"mdc--32e9cg-key":696,"mdc--4kqywn-key":713,"mdc-ytiqjf-key":737,"mdc-jj6yp2-key":761,"mdc-qgd5uy-key":778,"related-/guides/linux/systemd-timers-migration,/errors/linux/permission-denied-cron,/guides/linux/bash-script-debugging":802},{"id":4,"title":5,"appliesTo":6,"author":11,"body":12,"canonical":541,"code":31,"createdAt":542,"description":543,"difficulty":544,"draft":545,"estimatedTime":546,"extension":547,"faq":548,"howToSteps":561,"howToTotalTime":574,"image":541,"keywords":575,"locale":583,"meta":584,"navigation":175,"path":585,"platform":586,"related":587,"section":591,"seo":592,"severity":544,"stem":593,"summary":594,"tags":595,"twitterCreator":541,"twitterSite":541,"type":600,"updatedAt":542,"__hash__":601},"content_ru/guides/linux/cron-errors-troubleshooting.md","Ошибки cron в Linux: причины появления и быстрые методы исправления",[7,8,9,10],"Ubuntu 22.04/24.04 LTS","Debian 11/12","RHEL 9 / AlmaLinux 9","CentOS Stream 9","FixPedia Team",{"type":13,"value":14,"toc":530},"minimark",[15,20,37,51,55,58,119,123,128,138,193,203,228,238,242,252,286,293,303,310,313,317,329,339,366,378,382,389,419,442,448,457,464,468,526],[16,17,19],"h2",{"id":18},"что-означает-ошибка-cron_err","Что означает ошибка CRON_ERR",[21,22,23,24,28,29,32,33,36],"p",{},"Планировщик ",[25,26,27],"code",{},"cron"," не выводит единый цифровой код сбоя, подобно Windows. Запись ",[25,30,31],{},"CRON_ERR"," или сообщения вида ",[25,34,35],{},"(CRON) error"," в системных логах — это собирательный индикатор того, что демон не смог выполнить запланированное задание или само задание завершилось с ненулевым статусом выхода.",[21,38,39,40,43,44,43,47,50],{},"Вы столкнётесь с этой проблемой, когда автоматизированные скрипты перестают выполняться по расписанию, файлы не обновляются, или на вашу почту приходят пустые письма с кодами ",[25,41,42],{},"1",", ",[25,45,46],{},"126",[25,48,49],{},"127",". Ошибка проявляется строго в фоновом режиме, поэтому без явного логирования её легко пропустить до тех пор, пока не накопятся критические последствия.",[16,52,54],{"id":53},"причины-возникновения","Причины возникновения",[21,56,57],{},"Сбой планировщика почти всегда сводится к одному из следующих факторов:",[59,60,61,80,94,104,113],"ol",{},[62,63,64,71,72,75,76,79],"li",{},[65,66,67,68],"strong",{},"Неверные пути в переменной ",[25,69,70],{},"$PATH",". Cron запускает задачи с минимальным окружением, где ",[25,73,74],{},"/usr/local/bin"," или ",[25,77,78],{},"/snap/bin"," могут отсутствовать.",[62,81,82,85,86,89,90,93],{},[65,83,84],{},"Отсутствие прав на исполнение",". Файл скрипта не имеет бита ",[25,87,88],{},"+x",", или пользователь не добавлен в ",[25,91,92],{},"/etc/cron.allow",".",[62,95,96,99,100,103],{},[65,97,98],{},"Интерактивные запросы",". Скрипт требует ввода пароля, подтверждения ",[25,101,102],{},"sudo"," или вывода в терминал, что невозможно в фоновом демоне.",[62,105,106,109,110,93],{},[65,107,108],{},"Гонка ресурсов и блокировки",". Два задания пытаются одновременно писать в один лог-файл или базу данных без механизма ",[25,111,112],{},"flock",[62,114,115,118],{},[65,116,117],{},"Повреждение таблиц crontab",". Невалидный синтаксис строки (например, пробел вместо табуляции или пропущенное поле минут) заставляет парсер отбрасывать задачу целиком.",[16,120,122],{"id":121},"способы-решения","Способы решения",[124,125,127],"h3",{"id":126},"способ-1-проверка-состояния-и-перезапуск-службы","Способ 1: Проверка состояния и перезапуск службы",[21,129,130,131,133,134,137],{},"Первым делом убедитесь, что сам демон планировщика работает штатно. В зависимости от дистрибутива служба называется ",[25,132,27],{}," (Debian/Ubuntu) или ",[25,135,136],{},"crond"," (RHEL/AlmaLinux).",[139,140,145],"pre",{"className":141,"code":142,"language":143,"meta":144,"style":144},"language-bash shiki shiki-themes github-light github-dark","# Проверка статуса (Ubuntu/Debian)\nsystemctl status cron\n\n# Проверка статуса (RHEL/CentOS/Alma)\nsystemctl status crond\n","bash","",[25,146,147,156,170,177,183],{"__ignoreMap":144},[148,149,152],"span",{"class":150,"line":151},"line",1,[148,153,155],{"class":154},"sJ8bj","# Проверка статуса (Ubuntu/Debian)\n",[148,157,159,163,167],{"class":150,"line":158},2,[148,160,162],{"class":161},"sScJk","systemctl",[148,164,166],{"class":165},"sZZnC"," status",[148,168,169],{"class":165}," cron\n",[148,171,173],{"class":150,"line":172},3,[148,174,176],{"emptyLinePlaceholder":175},true,"\n",[148,178,180],{"class":150,"line":179},4,[148,181,182],{"class":154},"# Проверка статуса (RHEL/CentOS/Alma)\n",[148,184,186,188,190],{"class":150,"line":185},5,[148,187,162],{"class":161},[148,189,166],{"class":165},[148,191,192],{"class":165}," crond\n",[21,194,195,196,75,199,202],{},"Если вывод показывает ",[25,197,198],{},"inactive (dead)",[25,200,201],{},"failed",", запустите службу и добавьте её в автозагрузку:",[139,204,206],{"className":141,"code":205,"language":143,"meta":144,"style":144},"sudo systemctl enable --now cron   # или crond\n",[25,207,208],{"__ignoreMap":144},[148,209,210,212,215,218,222,225],{"class":150,"line":151},[148,211,102],{"class":161},[148,213,214],{"class":165}," systemctl",[148,216,217],{"class":165}," enable",[148,219,221],{"class":220},"sj4cs"," --now",[148,223,224],{"class":165}," cron",[148,226,227],{"class":154},"   # или crond\n",[229,230,231],"blockquote",{},[21,232,233,234,237],{},"💡 Совет: Если служба падает сразу после запуска, проверьте синтаксис всех пользовательских файлов через ",[25,235,236],{},"crontab -e"," — один некорректный символ может блокировать загрузку демона.",[124,239,241],{"id":240},"способ-2-чтение-системных-логов-и-отладка-вывода","Способ 2: Чтение системных логов и отладка вывода",[21,243,244,245,75,248,251],{},"Стандартные ошибки cron записываются в ",[25,246,247],{},"syslog",[25,249,250],{},"journal",". Отберите события за последний час, чтобы найти точную строку сбоя:",[139,253,255],{"className":141,"code":254,"language":143,"meta":144,"style":144},"journalctl -u cron --since \"1 hour ago\" | grep -i error\n",[25,256,257],{"__ignoreMap":144},[148,258,259,262,265,267,270,273,277,280,283],{"class":150,"line":151},[148,260,261],{"class":161},"journalctl",[148,263,264],{"class":220}," -u",[148,266,224],{"class":165},[148,268,269],{"class":220}," --since",[148,271,272],{"class":165}," \"1 hour ago\"",[148,274,276],{"class":275},"szBVR"," |",[148,278,279],{"class":161}," grep",[148,281,282],{"class":220}," -i",[148,284,285],{"class":165}," error\n",[21,287,288,289,292],{},"Для отладки конкретной задачи временно перенаправьте её стандартный вывод и поток ошибок во временный файл. Добавьте в конец строки crontab конструкцию ",[25,290,291],{},">> /tmp/task_debug.log 2>&1",":",[139,294,297],{"className":295,"code":296,"language":27,"meta":144,"style":144},"language-cron shiki shiki-themes github-light github-dark","*/5 * * * * /opt/scripts/backup.sh >> /tmp/cron_debug.log 2>&1\n",[25,298,299],{"__ignoreMap":144},[148,300,301],{"class":150,"line":151},[148,302,296],{},[21,304,305,306,309],{},"После срабатывания расписания откройте ",[25,307,308],{},"/tmp/cron_debug.log"," — там будет точный текст ошибки, который выдал ваш скрипт.",[311,312],"in-article-ad",{},[124,314,316],{"id":315},"способ-3-настройка-переменных-окружения-и-абсолютных-путей","Способ 3: Настройка переменных окружения и абсолютных путей",[21,318,319,320,322,323,75,326,93],{},"Самая частая причина кода ",[25,321,49],{}," (command not found) — отсутствие полных путей. Cron не наследует ваш ",[25,324,325],{},".bashrc",[25,327,328],{},".profile",[59,330,331,336],{},[62,332,333,334],{},"Откройте таблицу задач: ",[25,335,236],{},[62,337,338],{},"В самое начало файла добавьте явную переменную окружения:",[139,340,342],{"className":141,"code":341,"language":143,"meta":144,"style":144},"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\nSHELL=/bin/bash\n",[25,343,344,356],{"__ignoreMap":144},[148,345,346,350,353],{"class":150,"line":151},[148,347,349],{"class":348},"sVt8B","PATH",[148,351,352],{"class":275},"=",[148,354,355],{"class":165},"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\n",[148,357,358,361,363],{"class":150,"line":158},[148,359,360],{"class":348},"SHELL",[148,362,352],{"class":275},[148,364,365],{"class":165},"/bin/bash\n",[59,367,368],{"start":172},[62,369,370,371,374,375,93],{},"Замените относительные вызовы на абсолютные. Вместо ",[25,372,373],{},"python3 script.py"," используйте ",[25,376,377],{},"/usr/bin/python3 /home/user/scripts/task.py",[124,379,381],{"id":380},"способ-4-проверка-списков-доступа-и-блокировочных-файлов","Способ 4: Проверка списков доступа и блокировочных файлов",[21,383,384,385,388],{},"Если в логах появляется ",[25,386,387],{},"(username) ACCESS DENIED",", проверьте конфигурацию контроля доступа.",[139,390,392],{"className":141,"code":391,"language":143,"meta":144,"style":144},"# Проверка существования файлов контроля\nls -la /etc/cron.allow /etc/cron.deny 2>/dev/null\n",[25,393,394,399],{"__ignoreMap":144},[148,395,396],{"class":150,"line":151},[148,397,398],{"class":154},"# Проверка существования файлов контроля\n",[148,400,401,404,407,410,413,416],{"class":150,"line":158},[148,402,403],{"class":161},"ls",[148,405,406],{"class":220}," -la",[148,408,409],{"class":165}," /etc/cron.allow",[148,411,412],{"class":165}," /etc/cron.deny",[148,414,415],{"class":275}," 2>",[148,417,418],{"class":165},"/dev/null\n",[420,421,422,432],"ul",{},[62,423,424,425,427,428,431],{},"Если существует ",[25,426,92],{},", в него должен быть записан ваш пользователь. Файл ",[25,429,430],{},"cron.deny"," при этом игнорируется.",[62,433,434,435,438,439,93],{},"Если файлов нет, доступ открыт всем, кроме ",[25,436,437],{},"root"," (в некоторых дистрибутивах) и пользователей с оболочкой ",[25,440,441],{},"/sbin/nologin",[21,443,444,445,447],{},"Для предотвращения конфликтов нескольких экземпляров используйте ",[25,446,112],{}," прямо в строке crontab:",[139,449,451],{"className":295,"code":450,"language":27,"meta":144,"style":144},"0 2 * * * /usr/bin/flock -n /tmp/backup.lock /opt/scripts/backup_daily.sh\n",[25,452,453],{"__ignoreMap":144},[148,454,455],{"class":150,"line":151},[148,456,450],{},[21,458,459,460,463],{},"Флаг ",[25,461,462],{},"-n"," гарантирует мгновенный выход без запуска, если предыдущая задача ещё выполняется.",[16,465,467],{"id":466},"профилактика","Профилактика",[420,469,470,476,489,509,519],{},[62,471,472,475],{},[65,473,474],{},"Всегда используйте полные пути"," к бинарникам и скриптам. Не полагайтесь на переменные окружения пользователя.",[62,477,478,484,485,488],{},[65,479,480,481],{},"Настройте ",[25,482,483],{},"MAILTO"," или перенаправление логов в отдельную директорию ",[25,486,487],{},"/var/log/cron_tasks/",". Это позволит отслеживать статус выполнения без ручного входа на сервер.",[62,490,491,497,498,501,502,505,506,93],{},[65,492,493,494,496],{},"Избегайте ",[25,495,102],{}," внутри crontab",". Запускайте задачи от нужного пользователя через ",[25,499,500],{},"sudo -u username crontab -e"," или настраивайте ",[25,503,504],{},"sudoers"," с опцией ",[25,507,508],{},"NOPASSWD",[62,510,511,514,515,518],{},[65,512,513],{},"Регулярно проверяйте расписания"," командой ",[25,516,517],{},"crontab -l"," после внесения изменений. Ошибка в одной запятой может сдвинуть запуск на месяц.",[62,520,521,522,525],{},"Для сложных задач с зависимостями рассмотрите переход на ",[25,523,524],{},"systemd timers"," — они предоставляют лучшую изоляцию окружения и встроенные механизмы перезапуска при сбоях.",[527,528,529],"style",{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":144,"searchDepth":158,"depth":158,"links":531},[532,533,534,540],{"id":18,"depth":158,"text":19},{"id":53,"depth":158,"text":54},{"id":121,"depth":158,"text":122,"children":535},[536,537,538,539],{"id":126,"depth":172,"text":127},{"id":240,"depth":172,"text":241},{"id":315,"depth":172,"text":316},{"id":380,"depth":172,"text":381},{"id":466,"depth":158,"text":467},null,"2026-04-06 13:54:07","Не запускаются задачи cron? Разбираем ошибки планировщика, проверяем системные логи и быстро восстанавливаем автоматизацию. Пошаговые решения.","medium",false,"10-15 мин","md",[549,552,555,558],{"question":550,"answer":551},"Где искать логи работы cron в современных дистрибутивах Linux?","Логи обычно находятся в `/var/log/syslog` или `/var/log/cron.log`. Для просмотра используйте `journalctl -u cron` (Debian/Ubuntu) или `journalctl -u crond` (RHEL/CentOS).",{"question":553,"answer":554},"Почему скрипт работает вручную, но падает в cron?","Чаще всего это связано с ограниченным окружением cron без пользовательских переменных `$PATH` или отсутствием прав на выполнение файлов. Указывайте полные пути к исполняемым файлам и используйте `bash -c`.",{"question":556,"answer":557},"Можно ли перезапустить cron без потери запланированных задач?","Да, перезапуск службы через `systemctl restart cron` или `crond` только обновляет состояние демона и не удаляет пользовательские или системные задания из `crontab`.",{"question":559,"answer":560},"Как настроить отправку уведомлений об ошибках cron на почту?","Добавьте переменную `MAILTO=ваш@email.com` в начало вашего crontab. Для работы требуется настроенный локальный MTA (например, Postfix или ssmtp).",[562,565,568,571],{"name":563,"text":564},"Проверка статуса службы cron","Убедитесь, что демон активен, выполнив `systemctl status cron` или `systemctl status crond` в зависимости от дистрибутива.",{"name":566,"text":567},"Анализ системных логов","Используйте `journalctl -u cron --since '1 hour ago'` или проверьте `/var/log/syslog`, чтобы найти точный текст ошибки и время сбоя.",{"name":569,"text":570},"Проверка прав и путей к скриптам","Задайте абсолютные пути к исполняемым файлам в crontab и убедитесь, что у пользователя, запускающего задачу, есть права на выполнение (`chmod +x`).",{"name":572,"text":573},"Тестирование окружения cron","Запустите отладочную команду `env > /tmp/cron_env.txt` для сравнения переменных окружения с вашей текущей сессией и исправьте `$PATH` при необходимости.","PT15M",[576,577,578,579,580,581,582],"ошибка cron linux","не запускается crontab","cron exit code 127","как проверить логи cron","ошибка планировщика задач linux","cron не отправляет письма","настройка cron ubuntu","ru_RU",{},"/guides/linux/cron-errors-troubleshooting","linux",[588,589,590],"/guides/linux/systemd-timers-migration","/errors/linux/permission-denied-cron","/guides/linux/bash-script-debugging","Ошибки Linux",{"title":5,"description":543},"guides/linux/cron-errors-troubleshooting","Статья объясняет, почему задачи cron не запускаются или завершаются с ошибками, и предоставляет пошаговые инструкции по диагностике и устранению проблем в Linux.",[596,27,597,598,599,143],"Linux","администрирование сервера","планировщик задач","troubleshooting","error","GpTYGbNCZSB41PGfty1Dj-p-rM2Vqmy9qMlGBOZaRBc",{"data":603,"body":604},{},{"type":437,"children":605},[606],{"type":607,"tag":21,"props":608,"children":609},"element",{},[610,613,619,620,626,628,634,635,641],{"type":611,"value":612},"text","Логи обычно находятся в ",{"type":607,"tag":25,"props":614,"children":616},{"className":615},[],[617],{"type":611,"value":618},"/var/log/syslog",{"type":611,"value":75},{"type":607,"tag":25,"props":621,"children":623},{"className":622},[],[624],{"type":611,"value":625},"/var/log/cron.log",{"type":611,"value":627},". Для просмотра используйте ",{"type":607,"tag":25,"props":629,"children":631},{"className":630},[],[632],{"type":611,"value":633},"journalctl -u cron",{"type":611,"value":133},{"type":607,"tag":25,"props":636,"children":638},{"className":637},[],[639],{"type":611,"value":640},"journalctl -u crond",{"type":611,"value":642}," (RHEL/CentOS).",{"data":644,"body":645},{},{"type":437,"children":646},[647],{"type":607,"tag":21,"props":648,"children":649},{},[650,652,657,659,665],{"type":611,"value":651},"Чаще всего это связано с ограниченным окружением cron без пользовательских переменных ",{"type":607,"tag":25,"props":653,"children":655},{"className":654},[],[656],{"type":611,"value":70},{"type":611,"value":658}," или отсутствием прав на выполнение файлов. Указывайте полные пути к исполняемым файлам и используйте ",{"type":607,"tag":25,"props":660,"children":662},{"className":661},[],[663],{"type":611,"value":664},"bash -c",{"type":611,"value":93},{"data":667,"body":668},{},{"type":437,"children":669},[670],{"type":607,"tag":21,"props":671,"children":672},{},[673,675,681,682,687,689,695],{"type":611,"value":674},"Да, перезапуск службы через ",{"type":607,"tag":25,"props":676,"children":678},{"className":677},[],[679],{"type":611,"value":680},"systemctl restart cron",{"type":611,"value":75},{"type":607,"tag":25,"props":683,"children":685},{"className":684},[],[686],{"type":611,"value":136},{"type":611,"value":688}," только обновляет состояние демона и не удаляет пользовательские или системные задания из ",{"type":607,"tag":25,"props":690,"children":692},{"className":691},[],[693],{"type":611,"value":694},"crontab",{"type":611,"value":93},{"data":697,"body":698},{},{"type":437,"children":699},[700],{"type":607,"tag":21,"props":701,"children":702},{},[703,705,711],{"type":611,"value":704},"Добавьте переменную ",{"type":607,"tag":25,"props":706,"children":708},{"className":707},[],[709],{"type":611,"value":710},"MAILTO=ваш@email.com",{"type":611,"value":712}," в начало вашего crontab. Для работы требуется настроенный локальный MTA (например, Postfix или ssmtp).",{"data":714,"body":715},{},{"type":437,"children":716},[717],{"type":607,"tag":21,"props":718,"children":719},{},[720,722,728,729,735],{"type":611,"value":721},"Убедитесь, что демон активен, выполнив ",{"type":607,"tag":25,"props":723,"children":725},{"className":724},[],[726],{"type":611,"value":727},"systemctl status cron",{"type":611,"value":75},{"type":607,"tag":25,"props":730,"children":732},{"className":731},[],[733],{"type":611,"value":734},"systemctl status crond",{"type":611,"value":736}," в зависимости от дистрибутива.",{"data":738,"body":739},{},{"type":437,"children":740},[741],{"type":607,"tag":21,"props":742,"children":743},{},[744,746,752,754,759],{"type":611,"value":745},"Используйте ",{"type":607,"tag":25,"props":747,"children":749},{"className":748},[],[750],{"type":611,"value":751},"journalctl -u cron --since '1 hour ago'",{"type":611,"value":753}," или проверьте ",{"type":607,"tag":25,"props":755,"children":757},{"className":756},[],[758],{"type":611,"value":618},{"type":611,"value":760},", чтобы найти точный текст ошибки и время сбоя.",{"data":762,"body":763},{},{"type":437,"children":764},[765],{"type":607,"tag":21,"props":766,"children":767},{},[768,770,776],{"type":611,"value":769},"Задайте абсолютные пути к исполняемым файлам в crontab и убедитесь, что у пользователя, запускающего задачу, есть права на выполнение (",{"type":607,"tag":25,"props":771,"children":773},{"className":772},[],[774],{"type":611,"value":775},"chmod +x",{"type":611,"value":777},").",{"data":779,"body":780},{},{"type":437,"children":781},[782],{"type":607,"tag":21,"props":783,"children":784},{},[785,787,793,795,800],{"type":611,"value":786},"Запустите отладочную команду ",{"type":607,"tag":25,"props":788,"children":790},{"className":789},[],[791],{"type":611,"value":792},"env > /tmp/cron_env.txt",{"type":611,"value":794}," для сравнения переменных окружения с вашей текущей сессией и исправьте ",{"type":607,"tag":25,"props":796,"children":798},{"className":797},[],[799],{"type":611,"value":70},{"type":611,"value":801}," при необходимости.",[803,1898],{"id":804,"title":805,"appliesTo":806,"author":11,"body":812,"canonical":541,"code":541,"createdAt":1840,"description":1841,"difficulty":544,"draft":545,"estimatedTime":1842,"extension":547,"faq":1843,"howToSteps":1856,"howToTotalTime":1872,"image":541,"keywords":1873,"locale":583,"meta":1882,"navigation":175,"path":588,"platform":586,"related":1883,"section":1886,"seo":1887,"severity":541,"stem":1888,"summary":1889,"tags":1890,"twitterCreator":541,"twitterSite":541,"type":1896,"updatedAt":1840,"__hash__":1897},"content_ru/guides/linux/systemd-timers-migration.md","Миграция с cron на systemd таймеры: полное руководство по замене",[807,808,809,810,811],"systemd 235+","Ubuntu 20.04+","Debian 11+","RHEL/CentOS 8+","Fedora 32+",{"type":13,"value":813,"toc":1819},[814,818,838,842,877,881,884,939,942,972,980,987,991,1002,1127,1146,1150,1160,1246,1254,1280,1284,1287,1364,1372,1378,1382,1386,1397,1426,1430,1440,1501,1505,1510,1538,1542,1632,1636,1663,1682,1705,1722,1724,1728,1732,1737,1751,1754,1758,1765,1778,1781,1785,1790,1805,1809,1816],[16,815,817],{"id":816},"введение-зачем-это-нужно","Введение / Зачем это нужно",[21,819,820,821,43,824,827,828,830,831,834,835,837],{},"Cron — проверенный временем планировщик, но systemd таймеры предлагают современную альтернативу с ",[65,822,823],{},"лучшей интеграцией в систему",[65,825,826],{},"централизованным логированием"," через ",[25,829,261],{}," и ",[65,832,833],{},"более гибким синтаксисом расписания",". Миграция позволит вам контролировать задачи через ",[25,836,162],{},", настраивать зависимости от других сервисов и избегать проблем с окружением. После выполнения этого гайда ваши автоматические задачи будут управляться единообразно со всеми системными сервисами.",[16,839,841],{"id":840},"требования-подготовка","Требования / Подготовка",[59,843,844,850,860,866],{},[62,845,846,849],{},[65,847,848],{},"Система с systemd",": virtually все современные дистрибутивы Linux (Ubuntu 20.04+, Debian 11+, RHEL 8+).",[62,851,852,855,856,859],{},[65,853,854],{},"Права администратора (root или sudo)"," для создания файлов в ",[25,857,858],{},"/etc/systemd/system/"," и управления сервисами.",[62,861,862,865],{},[65,863,864],{},"Доступ к существующим cron-задачам",": знание их расписания и выполняемых команд.",[62,867,868,871,872,93],{},[65,869,870],{},"Базовое понимание systemd",": рекомендуется предварительно ознакомиться с ",[873,874,876],"a",{"href":875},"/guides/linux/systemd-service-basics","основами systemd сервисов",[16,878,880],{"id":879},"шаг-1-анализ-существующих-cron-задач","Шаг 1: Анализ существующих cron-задач",[21,882,883],{},"Прежде чем создавать новые юнит-файлы, полностью документируйте каждую cron-задачу.",[139,885,887],{"className":141,"code":886,"language":143,"meta":144,"style":144},"# Просмотр cron-задач текущего пользователя\ncrontab -l\n\n# Просмотр системных cron-задач (требует sudo)\nsudo cat /etc/crontab\nsudo ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/\n",[25,888,889,894,901,905,910,920],{"__ignoreMap":144},[148,890,891],{"class":150,"line":151},[148,892,893],{"class":154},"# Просмотр cron-задач текущего пользователя\n",[148,895,896,898],{"class":150,"line":158},[148,897,694],{"class":161},[148,899,900],{"class":220}," -l\n",[148,902,903],{"class":150,"line":172},[148,904,176],{"emptyLinePlaceholder":175},[148,906,907],{"class":150,"line":179},[148,908,909],{"class":154},"# Просмотр системных cron-задач (требует sudo)\n",[148,911,912,914,917],{"class":150,"line":185},[148,913,102],{"class":161},[148,915,916],{"class":165}," cat",[148,918,919],{"class":165}," /etc/crontab\n",[148,921,923,925,928,930,933,936],{"class":150,"line":922},6,[148,924,102],{"class":161},[148,926,927],{"class":165}," ls",[148,929,406],{"class":220},[148,931,932],{"class":165}," /etc/cron.d/",[148,934,935],{"class":165}," /etc/cron.hourly/",[148,937,938],{"class":165}," /etc/cron.daily/\n",[21,940,941],{},"Для каждой задачи запишите:",[420,943,944,954,960,966],{},[62,945,946,949,950,953],{},[65,947,948],{},"Расписание"," (например, ",[25,951,952],{},"0 2 * * *"," — каждый день в 2:00).",[62,955,956,959],{},[65,957,958],{},"Выполняемую команду"," и её аргументы.",[62,961,962,965],{},[65,963,964],{},"Пользователя",", от которого она запускается (для системных crontab).",[62,967,968,971],{},[65,969,970],{},"Необходимые переменные окружения"," (если есть).",[21,973,974],{},[65,975,976,977,292],{},"Пример мигрируемой задачи из ",[25,978,979],{},"/etc/crontab",[139,981,985],{"className":982,"code":984,"language":611},[983],"language-text","0 3 * * * root /usr/local/bin/backup.sh --rotate --compress\n",[25,986,984],{"__ignoreMap":144},[16,988,990],{"id":989},"шаг-2-создание-юнит-файла-сервиса-service","Шаг 2: Создание юнит-файла сервиса (.service)",[21,992,993,994,998,999,93],{},"Сервисный файл описывает, ",[995,996,997],"em",{},"что"," выполнять. Создайте файл ",[25,1000,1001],{},"/etc/systemd/system/backup.service",[139,1003,1007],{"className":1004,"code":1005,"language":1006,"meta":144,"style":144},"language-ini shiki shiki-themes github-light github-dark","[Unit]\nDescription=Ежедневное резервное копирование данных\nDocumentation=man:backup.sh(8)\n# Зависит от сети, если скрипт работает по сети\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=oneshot\n# Команда из cron\nExecStart=/usr/local/bin/backup.sh --rotate --compress\n# Если нужно, укажите пользователя/группу (по умолчанию root)\n# User=backupuser\n# Group=backupgroup\n# Импорт переменных окружения, если они были в crontab\n# EnvironmentFile=/etc/default/backup\n# Поведение при ошибках (по умолчанию restart=on-failure для не-oneshot)\n# Restart=no\n\n[Install]\nWantedBy=multi-user.target\n","ini",[25,1008,1009,1014,1019,1024,1029,1034,1039,1044,1050,1056,1062,1068,1074,1080,1086,1092,1098,1104,1110,1115,1121],{"__ignoreMap":144},[148,1010,1011],{"class":150,"line":151},[148,1012,1013],{},"[Unit]\n",[148,1015,1016],{"class":150,"line":158},[148,1017,1018],{},"Description=Ежедневное резервное копирование данных\n",[148,1020,1021],{"class":150,"line":172},[148,1022,1023],{},"Documentation=man:backup.sh(8)\n",[148,1025,1026],{"class":150,"line":179},[148,1027,1028],{},"# Зависит от сети, если скрипт работает по сети\n",[148,1030,1031],{"class":150,"line":185},[148,1032,1033],{},"After=network-online.target\n",[148,1035,1036],{"class":150,"line":922},[148,1037,1038],{},"Wants=network-online.target\n",[148,1040,1042],{"class":150,"line":1041},7,[148,1043,176],{"emptyLinePlaceholder":175},[148,1045,1047],{"class":150,"line":1046},8,[148,1048,1049],{},"[Service]\n",[148,1051,1053],{"class":150,"line":1052},9,[148,1054,1055],{},"Type=oneshot\n",[148,1057,1059],{"class":150,"line":1058},10,[148,1060,1061],{},"# Команда из cron\n",[148,1063,1065],{"class":150,"line":1064},11,[148,1066,1067],{},"ExecStart=/usr/local/bin/backup.sh --rotate --compress\n",[148,1069,1071],{"class":150,"line":1070},12,[148,1072,1073],{},"# Если нужно, укажите пользователя/группу (по умолчанию root)\n",[148,1075,1077],{"class":150,"line":1076},13,[148,1078,1079],{},"# User=backupuser\n",[148,1081,1083],{"class":150,"line":1082},14,[148,1084,1085],{},"# Group=backupgroup\n",[148,1087,1089],{"class":150,"line":1088},15,[148,1090,1091],{},"# Импорт переменных окружения, если они были в crontab\n",[148,1093,1095],{"class":150,"line":1094},16,[148,1096,1097],{},"# EnvironmentFile=/etc/default/backup\n",[148,1099,1101],{"class":150,"line":1100},17,[148,1102,1103],{},"# Поведение при ошибках (по умолчанию restart=on-failure для не-oneshot)\n",[148,1105,1107],{"class":150,"line":1106},18,[148,1108,1109],{},"# Restart=no\n",[148,1111,1113],{"class":150,"line":1112},19,[148,1114,176],{"emptyLinePlaceholder":175},[148,1116,1118],{"class":150,"line":1117},20,[148,1119,1120],{},"[Install]\n",[148,1122,1124],{"class":150,"line":1123},21,[148,1125,1126],{},"WantedBy=multi-user.target\n",[229,1128,1129],{},[21,1130,1131,1132,1135,1136,1139,1140,1143,1144,93],{},"⚠️ ",[65,1133,1134],{},"Важно:"," Для разовых задач (",[25,1137,1138],{},"Type=oneshot",") systemd считает сервис завершённым после выполнения ",[25,1141,1142],{},"ExecStart",". Если нужно выполнить несколько команд, используйте скрипт или несколько ",[25,1145,1142],{},[16,1147,1149],{"id":1148},"шаг-3-создание-юнит-файла-таймера-timer","Шаг 3: Создание юнит-файла таймера (.timer)",[21,1151,1152,1153,1156,1157,93],{},"Таймерный файл описывает, ",[995,1154,1155],{},"когда"," запускать сервис. Создайте файл ",[25,1158,1159],{},"/etc/systemd/system/backup.timer",[139,1161,1163],{"className":1004,"code":1162,"language":1006,"meta":144,"style":144},"[Unit]\nDescription=Таймер для ежедневного резервного копирования\n# Убедитесь, что сервис готов к запуску (опционально)\nRequires=backup.service\n\n[Timer]\n# Календарное расписание: каждый день в 3:00\nOnCalendar=*-*-* 03:00:00\n# Альтернатива: интервал от последнего успешного запуска\n# OnUnitActiveSec=1d\n# Что делать, если задача пропущена (например, при выключении ПК)\n# Persistent=true\n# Задержка случайная (anti-thundering herd), если нужно\n# RandomizedDelaySec=10min\n\n[Install]\nWantedBy=timers.target\n",[25,1164,1165,1169,1174,1179,1184,1188,1193,1198,1203,1208,1213,1218,1223,1228,1233,1237,1241],{"__ignoreMap":144},[148,1166,1167],{"class":150,"line":151},[148,1168,1013],{},[148,1170,1171],{"class":150,"line":158},[148,1172,1173],{},"Description=Таймер для ежедневного резервного копирования\n",[148,1175,1176],{"class":150,"line":172},[148,1177,1178],{},"# Убедитесь, что сервис готов к запуску (опционально)\n",[148,1180,1181],{"class":150,"line":179},[148,1182,1183],{},"Requires=backup.service\n",[148,1185,1186],{"class":150,"line":185},[148,1187,176],{"emptyLinePlaceholder":175},[148,1189,1190],{"class":150,"line":922},[148,1191,1192],{},"[Timer]\n",[148,1194,1195],{"class":150,"line":1041},[148,1196,1197],{},"# Календарное расписание: каждый день в 3:00\n",[148,1199,1200],{"class":150,"line":1046},[148,1201,1202],{},"OnCalendar=*-*-* 03:00:00\n",[148,1204,1205],{"class":150,"line":1052},[148,1206,1207],{},"# Альтернатива: интервал от последнего успешного запуска\n",[148,1209,1210],{"class":150,"line":1058},[148,1211,1212],{},"# OnUnitActiveSec=1d\n",[148,1214,1215],{"class":150,"line":1064},[148,1216,1217],{},"# Что делать, если задача пропущена (например, при выключении ПК)\n",[148,1219,1220],{"class":150,"line":1070},[148,1221,1222],{},"# Persistent=true\n",[148,1224,1225],{"class":150,"line":1076},[148,1226,1227],{},"# Задержка случайная (anti-thundering herd), если нужно\n",[148,1229,1230],{"class":150,"line":1082},[148,1231,1232],{},"# RandomizedDelaySec=10min\n",[148,1234,1235],{"class":150,"line":1088},[148,1236,176],{"emptyLinePlaceholder":175},[148,1238,1239],{"class":150,"line":1094},[148,1240,1120],{},[148,1242,1243],{"class":150,"line":1100},[148,1244,1245],{},"WantedBy=timers.target\n",[21,1247,1248,292],{},[65,1249,1250,1251],{},"Синтаксис ",[25,1252,1253],{},"OnCalendar",[420,1255,1256,1262,1268,1274],{},[62,1257,1258,1261],{},[25,1259,1260],{},"*-*-* 03:00:00"," — ежедневно в 03:00.",[62,1263,1264,1267],{},[25,1265,1266],{},"Mon *-*-* 02:30:00"," — каждый понедельник в 02:30.",[62,1269,1270,1273],{},[25,1271,1272],{},"*-*-1 00:00:00"," — в первый день каждого месяца.",[62,1275,1276,1279],{},[25,1277,1278],{},"00/30:00:00"," — каждые 30 минут (в 00 и 30 минут каждого часа).",[16,1281,1283],{"id":1282},"шаг-4-активация-и-проверка-таймера","Шаг 4: Активация и проверка таймера",[21,1285,1286],{},"После создания файлов загрузите конфигурацию в systemd и активируйте таймер.",[139,1288,1290],{"className":141,"code":1289,"language":143,"meta":144,"style":144},"# Перечитать конфигурации systemd (обязательно после создания новых юнит-файлов)\nsudo systemctl daemon-reload\n\n# Включить и сразу запустить таймер\nsudo systemctl enable --now backup.timer\n\n# Проверить статус таймера\nsystemctl status backup.timer\n\n# Посмотреть список всех активных таймеров\nsystemctl list-timers --all\n",[25,1291,1292,1297,1306,1310,1315,1328,1332,1337,1345,1349,1354],{"__ignoreMap":144},[148,1293,1294],{"class":150,"line":151},[148,1295,1296],{"class":154},"# Перечитать конфигурации systemd (обязательно после создания новых юнит-файлов)\n",[148,1298,1299,1301,1303],{"class":150,"line":158},[148,1300,102],{"class":161},[148,1302,214],{"class":165},[148,1304,1305],{"class":165}," daemon-reload\n",[148,1307,1308],{"class":150,"line":172},[148,1309,176],{"emptyLinePlaceholder":175},[148,1311,1312],{"class":150,"line":179},[148,1313,1314],{"class":154},"# Включить и сразу запустить таймер\n",[148,1316,1317,1319,1321,1323,1325],{"class":150,"line":185},[148,1318,102],{"class":161},[148,1320,214],{"class":165},[148,1322,217],{"class":165},[148,1324,221],{"class":220},[148,1326,1327],{"class":165}," backup.timer\n",[148,1329,1330],{"class":150,"line":922},[148,1331,176],{"emptyLinePlaceholder":175},[148,1333,1334],{"class":150,"line":1041},[148,1335,1336],{"class":154},"# Проверить статус таймера\n",[148,1338,1339,1341,1343],{"class":150,"line":1046},[148,1340,162],{"class":161},[148,1342,166],{"class":165},[148,1344,1327],{"class":165},[148,1346,1347],{"class":150,"line":1052},[148,1348,176],{"emptyLinePlaceholder":175},[148,1350,1351],{"class":150,"line":1058},[148,1352,1353],{"class":154},"# Посмотреть список всех активных таймеров\n",[148,1355,1356,1358,1361],{"class":150,"line":1064},[148,1357,162],{"class":161},[148,1359,1360],{"class":165}," list-timers",[148,1362,1363],{"class":220}," --all\n",[21,1365,1366,292],{},[65,1367,1368,1369],{},"Пример вывода ",[25,1370,1371],{},"list-timers",[139,1373,1376],{"className":1374,"code":1375,"language":611},[983],"NEXT                        LEFT          LAST                        PASSED       UNIT                ACTIVATES\nSun 2026-04-13 03:00:00 UTC 4h left       Sat 2026-04-12 03:00:00 UTC 14h ago      backup.timer        backup.service\n",[25,1377,1375],{"__ignoreMap":144},[16,1379,1381],{"id":1380},"шаг-5-миграция-сложных-сценариев","Шаг 5: Миграция сложных сценариев",[124,1383,1385],{"id":1384},"задачи-с-переменными-окружения","Задачи с переменными окружения",[21,1387,1388,1389,43,1391,1393,1394,292],{},"Если в cron использовались переменные (",[25,1390,349],{},[25,1392,483],{}," и т.д.), перенесите их в секцию ",[25,1395,1396],{},"[Service]",[139,1398,1400],{"className":1004,"code":1399,"language":1006,"meta":144,"style":144},"[Service]\nEnvironment=\"PATH=/usr/local/sbin:/usr/local/bin\"\nEnvironment=\"BACKUP_DIR=/var/backups\"\n# Или импортируйте из файла\nEnvironmentFile=/etc/sysconfig/backup\n",[25,1401,1402,1406,1411,1416,1421],{"__ignoreMap":144},[148,1403,1404],{"class":150,"line":151},[148,1405,1049],{},[148,1407,1408],{"class":150,"line":158},[148,1409,1410],{},"Environment=\"PATH=/usr/local/sbin:/usr/local/bin\"\n",[148,1412,1413],{"class":150,"line":172},[148,1414,1415],{},"Environment=\"BACKUP_DIR=/var/backups\"\n",[148,1417,1418],{"class":150,"line":179},[148,1419,1420],{},"# Или импортируйте из файла\n",[148,1422,1423],{"class":150,"line":185},[148,1424,1425],{},"EnvironmentFile=/etc/sysconfig/backup\n",[124,1427,1429],{"id":1428},"задачи-запускаемые-от-не-root-пользователя","Задачи, запускаемые от не-root пользователя",[21,1431,1432,1433,1436,1437,292],{},"Создайте юнит-файлы в домашней директории пользователя (",[25,1434,1435],{},"~/.config/systemd/user/",") и используйте ",[25,1438,1439],{},"systemctl --user",[139,1441,1443],{"className":141,"code":1442,"language":143,"meta":144,"style":144},"mkdir -p ~/.config/systemd/user/\n# Копируем .service и .timer файлы в эту директорию\nsystemctl --user daemon-reload\nsystemctl --user enable --now mytask.timer\n# Включите lingering для автозапуска без входа в систему\nsudo loginctl enable-linger $USER\n",[25,1444,1445,1456,1461,1470,1483,1488],{"__ignoreMap":144},[148,1446,1447,1450,1453],{"class":150,"line":151},[148,1448,1449],{"class":161},"mkdir",[148,1451,1452],{"class":220}," -p",[148,1454,1455],{"class":165}," ~/.config/systemd/user/\n",[148,1457,1458],{"class":150,"line":158},[148,1459,1460],{"class":154},"# Копируем .service и .timer файлы в эту директорию\n",[148,1462,1463,1465,1468],{"class":150,"line":172},[148,1464,162],{"class":161},[148,1466,1467],{"class":220}," --user",[148,1469,1305],{"class":165},[148,1471,1472,1474,1476,1478,1480],{"class":150,"line":179},[148,1473,162],{"class":161},[148,1475,1467],{"class":220},[148,1477,217],{"class":165},[148,1479,221],{"class":220},[148,1481,1482],{"class":165}," mytask.timer\n",[148,1484,1485],{"class":150,"line":185},[148,1486,1487],{"class":154},"# Включите lingering для автозапуска без входа в систему\n",[148,1489,1490,1492,1495,1498],{"class":150,"line":922},[148,1491,102],{"class":161},[148,1493,1494],{"class":165}," loginctl",[148,1496,1497],{"class":165}," enable-linger",[148,1499,1500],{"class":348}," $USER\n",[124,1502,1504],{"id":1503},"задачи-с-несколькими-командами","Задачи с несколькими командами",[21,1506,1507,1508,292],{},"Вынесите команды в отдельный скрипт (как в примере выше) или используйте несколько ",[25,1509,1142],{},[139,1511,1513],{"className":1004,"code":1512,"language":1006,"meta":144,"style":144},"[Service]\nType=oneshot\nExecStart=/usr/bin/step1.sh\nExecStart=/usr/bin/step2.sh\nRemainAfterExit=yes  # Сервис считается активным после завершения\n",[25,1514,1515,1519,1523,1528,1533],{"__ignoreMap":144},[148,1516,1517],{"class":150,"line":151},[148,1518,1049],{},[148,1520,1521],{"class":150,"line":158},[148,1522,1055],{},[148,1524,1525],{"class":150,"line":172},[148,1526,1527],{},"ExecStart=/usr/bin/step1.sh\n",[148,1529,1530],{"class":150,"line":179},[148,1531,1532],{},"ExecStart=/usr/bin/step2.sh\n",[148,1534,1535],{"class":150,"line":185},[148,1536,1537],{},"RemainAfterExit=yes  # Сервис считается активным после завершения\n",[16,1539,1541],{"id":1540},"проверка-результата","Проверка результата",[59,1543,1544,1591,1624],{},[62,1545,1546,1549,1550,1553,1554,1557,1558],{},[65,1547,1548],{},"Логирование",": все выводы ",[25,1551,1552],{},"stdout","/",[25,1555,1556],{},"stderr"," сервиса попадают в журнал systemd. Просмотрите их:\n",[139,1559,1561],{"className":141,"code":1560,"language":143,"meta":144,"style":144},"journalctl -u backup.service -b  # Логи последней загрузки\njournalctl -u backup.service --since \"1 hour ago\"\n",[25,1562,1563,1578],{"__ignoreMap":144},[148,1564,1565,1567,1569,1572,1575],{"class":150,"line":151},[148,1566,261],{"class":161},[148,1568,264],{"class":220},[148,1570,1571],{"class":165}," backup.service",[148,1573,1574],{"class":220}," -b",[148,1576,1577],{"class":154},"  # Логи последней загрузки\n",[148,1579,1580,1582,1584,1586,1588],{"class":150,"line":158},[148,1581,261],{"class":161},[148,1583,264],{"class":220},[148,1585,1571],{"class":165},[148,1587,269],{"class":220},[148,1589,1590],{"class":165}," \"1 hour ago\"\n",[62,1592,1593,1596,1597],{},[65,1594,1595],{},"Тестовый запуск",": принудительно запустите сервис, чтобы убедиться в работоспособности команды:\n",[139,1598,1600],{"className":141,"code":1599,"language":143,"meta":144,"style":144},"sudo systemctl start backup.service\nsudo systemctl status backup.service\n",[25,1601,1602,1614],{"__ignoreMap":144},[148,1603,1604,1606,1608,1611],{"class":150,"line":151},[148,1605,102],{"class":161},[148,1607,214],{"class":165},[148,1609,1610],{"class":165}," start",[148,1612,1613],{"class":165}," backup.service\n",[148,1615,1616,1618,1620,1622],{"class":150,"line":158},[148,1617,102],{"class":161},[148,1619,214],{"class":165},[148,1621,166],{"class":165},[148,1623,1613],{"class":165},[62,1625,1626,1628,1629,777],{},[65,1627,948],{},": убедитесь, что таймер корректно вычисляет следующее время запуска (",[25,1630,1631],{},"systemctl list-timers",[16,1633,1635],{"id":1634},"возможные-проблемы","Возможные проблемы",[229,1637,1638],{},[21,1639,1640,1643,1644,1647,1648,1651,1652,1655,1656,1659,1660,93],{},[65,1641,1642],{},"Таймер не активируется после перезагрузки","\nУбедитесь, что таймер ",[65,1645,1646],{},"включен"," (",[25,1649,1650],{},"systemctl is-enabled backup.timer"," должен вернуть ",[25,1653,1654],{},"enabled","). Если ",[25,1657,1658],{},"disabled",", выполните ",[25,1661,1662],{},"systemctl enable backup.timer",[229,1664,1665],{},[21,1666,1667,1670,1671,1674,1675,1678,1679,777],{},[65,1668,1669],{},"Сервис завершается с ошибкой, но таймер продолжает работать","\nПо умолчанию systemd считает таймер активным, даже если сервис упал. Чтобы таймер отключался при сбое, добавьте в ",[25,1672,1673],{},"[Timer]",": ",[25,1676,1677],{},"FailureAction=stop",". Также проверьте логи сервиса (",[25,1680,1681],{},"journalctl -u backup.service",[229,1683,1684],{},[21,1685,1686,1689,1690,1693,1694,1696,1697,1700,1701,1704],{},[65,1687,1688],{},"Расписание срабатывает не в то время","\nПроверьте часовой пояс системы (",[25,1691,1692],{},"timedatectl",") и синтаксис ",[25,1695,1253],{},". Учтите, что ",[25,1698,1699],{},"OnUnitActiveSec"," считает интервал от ",[65,1702,1703],{},"последнего успешного запуска",", а не от запланированного.",[229,1706,1707],{},[21,1708,1709,1712,1713,1715,1716,75,1719,93],{},[65,1710,1711],{},"Не работают переменные окружения из crontab","\nCron автоматически устанавливает минимальный ",[25,1714,349],{}," и другие переменные. В systemd их нужно задавать явно через ",[25,1717,1718],{},"Environment",[25,1720,1721],{},"EnvironmentFile",[311,1723],{},[16,1725,1727],{"id":1726},"дополнительные-настройки","Дополнительные настройки",[124,1729,1731],{"id":1730},"отложенный-запуск-randomizeddelaysec","Отложенный запуск (RandomizedDelaySec)",[21,1733,1734,1735,292],{},"Для распределения нагрузки добавьте в ",[25,1736,1673],{},[139,1738,1740],{"className":1004,"code":1739,"language":1006,"meta":144,"style":144},"RandomizedDelaySec=15min\nOnCalendar=*-*-* 03:00:00\n",[25,1741,1742,1747],{"__ignoreMap":144},[148,1743,1744],{"class":150,"line":151},[148,1745,1746],{},"RandomizedDelaySec=15min\n",[148,1748,1749],{"class":150,"line":158},[148,1750,1202],{},[21,1752,1753],{},"Это запустит задачу в случайный момент в интервале 03:00–03:15.",[124,1755,1757],{"id":1756},"запуск-только-при-наличии-сети","Запуск только при наличии сети",[21,1759,1760,1761,1764],{},"Если задача требует интернета, добавьте в ",[25,1762,1763],{},"[Unit]"," сервиса:",[139,1766,1768],{"className":1004,"code":1767,"language":1006,"meta":144,"style":144},"After=network-online.target\nWants=network-online.target\n",[25,1769,1770,1774],{"__ignoreMap":144},[148,1771,1772],{"class":150,"line":151},[148,1773,1033],{},[148,1775,1776],{"class":150,"line":158},[148,1777,1038],{},[21,1779,1780],{},"Это гарантирует запуск только после полного поднятия сети.",[124,1782,1784],{"id":1783},"ограничение-времени-выполнения","Ограничение времени выполнения",[21,1786,1787,1788,292],{},"Чтобы задача не висела вечно, задайте таймаут в ",[25,1789,1396],{},[139,1791,1793],{"className":1004,"code":1792,"language":1006,"meta":144,"style":144},"TimeoutStartSec=1h  # Прервать, если не завершится за час\nTimeoutStopSec=5min\n",[25,1794,1795,1800],{"__ignoreMap":144},[148,1796,1797],{"class":150,"line":151},[148,1798,1799],{},"TimeoutStartSec=1h  # Прервать, если не завершится за час\n",[148,1801,1802],{"class":150,"line":158},[148,1803,1804],{},"TimeoutStopSec=5min\n",[16,1806,1808],{"id":1807},"заключение","Заключение",[21,1810,1811,1812,1815],{},"Миграция с cron на systemd таймеры — это ",[65,1813,1814],{},"инвестицию в стабильность и управляемость"," вашей системы. Вы получаете единый инструмент для всех периодических задач, детальное логирование и возможность построения сложных зависимостей. Начните с одной не критичной задачи, протестируйте её, и постепенно переносите остальные.",[527,1817,1818],{},"html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":144,"searchDepth":158,"depth":158,"links":1820},[1821,1822,1823,1824,1825,1826,1827,1832,1833,1834,1839],{"id":816,"depth":158,"text":817},{"id":840,"depth":158,"text":841},{"id":879,"depth":158,"text":880},{"id":989,"depth":158,"text":990},{"id":1148,"depth":158,"text":1149},{"id":1282,"depth":158,"text":1283},{"id":1380,"depth":158,"text":1381,"children":1828},[1829,1830,1831],{"id":1384,"depth":172,"text":1385},{"id":1428,"depth":172,"text":1429},{"id":1503,"depth":172,"text":1504},{"id":1540,"depth":158,"text":1541},{"id":1634,"depth":158,"text":1635},{"id":1726,"depth":158,"text":1727,"children":1835},[1836,1837,1838],{"id":1730,"depth":172,"text":1731},{"id":1756,"depth":172,"text":1757},{"id":1783,"depth":172,"text":1784},{"id":1807,"depth":158,"text":1808},"2026-04-08 18:35:03","Пошаговая инструкция по миграции cron-задач на systemd таймеры в Linux. Узнайте преимущества, напишите юнит-файлы и настройте автоматизацию без потерь. Готовые примеры для Ubuntu/Debian и RHEL.","15-30 мин",[1844,1847,1850,1853],{"question":1845,"answer":1846},"Что делать, если systemd таймер не запускается по расписанию?","Проверьте статус таймера командой `systemctl list-timers --all`, убедитесь, что он активен (`enabled`). Также проверьте журнал: `journalctl -u имя_сервиса.timer -b`.",{"question":1848,"answer":1849},"Можно ли использовать переменные окружения из crontab в systemd?","Да, но их нужно явно объявить в юнит-файле сервиса в секции `[Service]` через `Environment=\"VAR=value\"` или импортировать из файла через `EnvironmentFile=/etc/default/имя_сервиса`.",{"question":1851,"answer":1852},"Как перенести задачу, которая запускается каждые 5 минут?","В юнит-файле таймера укажите `OnUnitActiveSec=5min` для интервала от последнего запуска или `OnCalendar=*:0/5` для календарного расписания (каждые 5 минут, в 0,5,10... минут каждого часа).",{"question":1854,"answer":1855},"Нужно ли перезагружать систему после создания юнит-файлов?","Нет. После копирования файлов в `/etc/systemd/system/` выполните `systemctl daemon-reload`, чтобы systemd прочитал новые конфигурации.",[1857,1860,1863,1866,1869],{"name":1858,"text":1859},"Анализ существующих cron-задач","Просмотрите текущие задачи с помощью `crontab -l` (для текущего пользователя) или `cat /etc/crontab` и `ls /etc/cron.*`. Запишите расписание, команды и аргументы.",{"name":1861,"text":1862},"Создание юнит-файла сервиса (.service)","Создайте файл `/etc/systemd/system/имя_сервиса.service`. В секции `[Service]` укажите `ExecStart` с командой из cron. Добавьте `Type=oneshot` для разовых задач.",{"name":1864,"text":1865},"Создание юнит-файла таймера (.timer)","Создайте файл `/etc/systemd/system/имя_сервиса.timer`. В секции `[Timer]` определите расписание через `OnCalendar` (календарное) или `OnUnitActiveSec` (интервал). Свяжите с сервисом через `Unit=имя_сервиса.service`.",{"name":1867,"text":1868},"Активация и запуск таймера","Включите автозапуск таймера: `systemctl enable --now имя_сервиса.timer`. Флаг `--now` запускает его немедленно. Проверьте статус: `systemctl status имя_сервиса.timer`.",{"name":1870,"text":1871},"Перенос сложных cron-задач","Для задач с зависимостями или окружением используйте секции `[Service]`: `User=`/`Group=` для смены пользователя, `EnvironmentFile=` для переменных, `After=`/`Requires=` для зависимостей от других сервисов.","PT20M",[1874,1875,1876,1877,1878,1879,1880,1881],"миграция cron на systemd таймеры","замена cron на systemd","systemd timer вместо cron","как перенести cron задачу в systemd","cron migration to systemd timer","ошибка cron не запускается systemd","настройка systemd timer пример","systemd timer vs cron",{},[875,1884,1885],"/guides/linux/cron-troubleshooting","/errors/linux/systemd-timer-failed","Гайды Linux",{"title":805,"description":1841},"guides/linux/systemd-timers-migration","Это руководство поможет вам перевести существующие cron-задачи на современные systemd таймеры. Вы получите более гибкое управление, логирование и интеграцию с системой, сохранив всю функциональность.",[1891,1892,27,1893,1894,1895,694],"гайды linux","systemd","автоматизация","администрирование","systemd-timer","guide","5THt0jxHMVTdUhoFajRzsfqEMRKeuwK0CVH6cRODgOI",{"id":1899,"title":1900,"appliesTo":1901,"author":11,"body":1904,"canonical":541,"code":2394,"createdAt":2395,"description":2396,"difficulty":2397,"draft":545,"estimatedTime":2398,"extension":547,"faq":2399,"howToSteps":2408,"howToTotalTime":2421,"image":541,"keywords":2422,"locale":583,"meta":2431,"navigation":175,"path":589,"platform":586,"related":2432,"section":591,"seo":2436,"severity":544,"stem":2437,"summary":2438,"tags":2439,"twitterCreator":541,"twitterSite":541,"type":600,"updatedAt":2395,"__hash__":2445},"content_ru/errors/linux/permission-denied-cron.md","Ошибка Permission denied в cron: причины и быстрое решение",[1902,8,1903,10],"Ubuntu 22.04/24.04","RHEL 8/9",{"type":13,"value":1905,"toc":2382},[1906,1910,1920,1929,1931,1993,1995,1999,2002,2064,2076,2080,2083,2086,2098,2101,2107,2110,2116,2119,2121,2125,2128,2135,2208,2214,2257,2268,2273,2298,2304,2328,2331,2333,2336,2379],[16,1907,1909],{"id":1908},"что-означает-ошибка-permission-denied-в-cron","Что означает ошибка Permission denied в cron",[21,1911,1912,1913,1916,1917,1919],{},"Когда планировщик задач пытается запустить ваш скрипт, ядро Linux отклоняет запрос с сообщением ",[25,1914,1915],{},"/bin/sh: 1: /путь/к/скрипту: Permission denied"," и кодом выхода ",[25,1918,46],{},". Это стандартная реакция системы на отсутствие необходимых прав доступа, неверного владельца или блокировку модулями безопасности (SELinux/AppArmor).",[21,1921,1922,1923,75,1925,1928],{},"Обычно ошибка появляется в системных логах (",[25,1924,618],{},[25,1926,1927],{},"/var/log/cron",") либо приходит на почту пользователя cron, если настроен вывод. Задача не выполняется, а вы теряете данные или пропускаете резервное копирование без явного уведомления в консоли.",[16,1930,54],{"id":53},[420,1932,1933,1946,1955,1971,1977],{},[62,1934,1935,1938,1939,1647,1942,1945],{},[65,1936,1937],{},"Отсутствует бит исполнения."," Файл был загружен, скопирован или создан с правами ",[25,1940,1941],{},"644",[25,1943,1944],{},"-rw-r--r--","), что разрешает только чтение.",[62,1947,1948,1951,1952,1954],{},[65,1949,1950],{},"Несоответствие владельца."," Скрипт принадлежит ",[25,1953,437],{},", а задача добавлена в crontab обычного пользователя, или наоборот.",[62,1956,1957,1960,1961,1963,1964,75,1967,1970],{},[65,1958,1959],{},"Использование относительных путей."," Cron запускает команды из домашней директории пользователя, не инициализируя переменную ",[25,1962,70],{},". Символ ",[25,1965,1966],{},"~",[25,1968,1969],{},"./"," в расписании не сработают.",[62,1972,1973,1976],{},[65,1974,1975],{},"Блокировка SELinux или AppArmor."," В корпоративных дистрибутивах политики безопасности строго контролируют запуск исполняемых файлов из нестандартных каталогов.",[62,1978,1979,1982,1983,1986,1987,75,1990,777],{},[65,1980,1981],{},"Скрипт находится в защищённой файловой системе."," Раздел смонтирован с флагом ",[25,1984,1985],{},"noexec"," (часто встречается в ",[25,1988,1989],{},"/tmp",[25,1991,1992],{},"/home",[16,1994,122],{"id":121},[124,1996,1998],{"id":1997},"способ-1-корректировка-прав-и-владельца","Способ 1: Корректировка прав и владельца",[21,2000,2001],{},"Сначала убедитесь, что файл действительно является исполняемым и принадлежит тому пользователю, под которым работает cron.",[59,2003,2004,2022,2044],{},[62,2005,2006,2007],{},"Проверьте текущие права:\n",[139,2008,2010],{"className":141,"code":2009,"language":143,"meta":144,"style":144},"ls -l /opt/scripts/my_task.sh\n",[25,2011,2012],{"__ignoreMap":144},[148,2013,2014,2016,2019],{"class":150,"line":151},[148,2015,403],{"class":161},[148,2017,2018],{"class":220}," -l",[148,2020,2021],{"class":165}," /opt/scripts/my_task.sh\n",[62,2023,2024,2025,2028,2029],{},"Если бит ",[25,2026,2027],{},"x"," отсутствует, добавьте его:\n",[139,2030,2032],{"className":141,"code":2031,"language":143,"meta":144,"style":144},"chmod +x /opt/scripts/my_task.sh\n",[25,2033,2034],{"__ignoreMap":144},[148,2035,2036,2039,2042],{"class":150,"line":151},[148,2037,2038],{"class":161},"chmod",[148,2040,2041],{"class":165}," +x",[148,2043,2021],{"class":165},[62,2045,2046,2047],{},"Измените владельца на учётную запись, от имени которой выполняется задача:\n",[139,2048,2050],{"className":141,"code":2049,"language":143,"meta":144,"style":144},"sudo chown username:username /opt/scripts/my_task.sh\n",[25,2051,2052],{"__ignoreMap":144},[148,2053,2054,2056,2059,2062],{"class":150,"line":151},[148,2055,102],{"class":161},[148,2057,2058],{"class":165}," chown",[148,2060,2061],{"class":165}," username:username",[148,2063,2021],{"class":165},[229,2065,2066],{},[21,2067,2068,2069,2072,2073,2075],{},"💡 Совет: Для системных задач, добавленных через ",[25,2070,2071],{},"sudo crontab -e",", оставляйте владельцем ",[25,2074,437],{},". Для пользовательских задач используйте обычного пользователя.",[124,2077,2079],{"id":2078},"способ-2-явный-вызов-интерпретатора-и-абсолютные-пути","Способ 2: Явный вызов интерпретатора и абсолютные пути",[21,2081,2082],{},"Даже при правильных правах cron может не найти исполняемый файл или зависимости. Всегда указывайте полные пути.",[21,2084,2085],{},"Откройте редактор crontab:",[139,2087,2089],{"className":141,"code":2088,"language":143,"meta":144,"style":144},"crontab -e\n",[25,2090,2091],{"__ignoreMap":144},[148,2092,2093,2095],{"class":150,"line":151},[148,2094,694],{"class":161},[148,2096,2097],{"class":220}," -e\n",[21,2099,2100],{},"Замените строку вида:",[139,2102,2105],{"className":2103,"code":2104,"language":611},[983],"*/5 * * * * ./backup.sh\n",[25,2106,2104],{"__ignoreMap":144},[21,2108,2109],{},"На:",[139,2111,2114],{"className":2112,"code":2113,"language":611},[983],"*/5 * * * * /usr/bin/bash /opt/scripts/backup.sh >> /var/log/backup_cron.log 2>&1\n",[25,2115,2113],{"__ignoreMap":144},[21,2117,2118],{},"Перенаправление вывода в лог поможет отследить дальнейшие ошибки без захламления почты.",[311,2120],{},[124,2122,2124],{"id":2123},"способ-3-проверка-и-настройка-политик-безопасности","Способ 3: Проверка и настройка политик безопасности",[21,2126,2127],{},"Если права выставлены верно, но ошибка сохраняется, проверьте, не блокирует ли выполнение модуль безопасности.",[21,2129,2130,2131,2134],{},"Для ",[65,2132,2133],{},"SELinux"," (RHEL/CentOS/Fedora):",[59,2136,2137,2149,2174],{},[62,2138,2139,2140],{},"Убедитесь в статусе модуля:\n",[139,2141,2143],{"className":141,"code":2142,"language":143,"meta":144,"style":144},"sestatus\n",[25,2144,2145],{"__ignoreMap":144},[148,2146,2147],{"class":150,"line":151},[148,2148,2142],{"class":161},[62,2150,2151,2152],{},"Найдите блокировки за последние 10 минут:\n",[139,2153,2155],{"className":141,"code":2154,"language":143,"meta":144,"style":144},"ausearch -m AVC -ts recent\n",[25,2156,2157],{"__ignoreMap":144},[148,2158,2159,2162,2165,2168,2171],{"class":150,"line":151},[148,2160,2161],{"class":161},"ausearch",[148,2163,2164],{"class":220}," -m",[148,2166,2167],{"class":165}," AVC",[148,2169,2170],{"class":220}," -ts",[148,2172,2173],{"class":165}," recent\n",[62,2175,2176,2177,2180,2181,2201,2202,830,2205,93],{},"Если в выводе есть ",[25,2178,2179],{},"denied { execute }"," для вашего скрипта, разрешите выполнение:\n",[139,2182,2184],{"className":141,"code":2183,"language":143,"meta":144,"style":144},"sudo chcon -t bin_t /opt/scripts/my_task.sh\n",[25,2185,2186],{"__ignoreMap":144},[148,2187,2188,2190,2193,2196,2199],{"class":150,"line":151},[148,2189,102],{"class":161},[148,2191,2192],{"class":165}," chcon",[148,2194,2195],{"class":220}," -t",[148,2197,2198],{"class":165}," bin_t",[148,2200,2021],{"class":165},"\nДля постоянного применения используйте ",[25,2203,2204],{},"semanage fcontext",[25,2206,2207],{},"restorecon",[21,2209,2130,2210,2213],{},[65,2211,2212],{},"AppArmor"," (Ubuntu/Debian):",[59,2215,2216,2231],{},[62,2217,2218,2219],{},"Проверьте статус профиля:\n",[139,2220,2222],{"className":141,"code":2221,"language":143,"meta":144,"style":144},"sudo aa-status\n",[25,2223,2224],{"__ignoreMap":144},[148,2225,2226,2228],{"class":150,"line":151},[148,2227,102],{"class":161},[148,2229,2230],{"class":165}," aa-status\n",[62,2232,2233,2234,2237,2238,2241,2242],{},"Если скрипт попадает под строгий профиль, добавьте исключение в ",[25,2235,2236],{},"/etc/apparmor.d/local/usr.bin.cron"," или переведите профиль в режим жалоб (",[25,2239,2240],{},"complain","):\n",[139,2243,2245],{"className":141,"code":2244,"language":143,"meta":144,"style":144},"sudo aa-complain /usr/bin/cron\n",[25,2246,2247],{"__ignoreMap":144},[148,2248,2249,2251,2254],{"class":150,"line":151},[148,2250,102],{"class":161},[148,2252,2253],{"class":165}," aa-complain",[148,2255,2256],{"class":165}," /usr/bin/cron\n",[124,2258,2260,2261,2264,2265],{"id":2259},"способ-4-запуск-через-run-parts-или-оболочку-sh","Способ 4: Запуск через ",[25,2262,2263],{},"run-parts"," или оболочку ",[25,2266,2267],{},"sh",[21,2269,2270,2271,93],{},"Иногда проще не менять права, а передать скрипт оболочке, которая сама обработает выполнение. Это особенно полезно, если файл размещён на сетевом диске или в ",[25,2272,1989],{},[139,2274,2276],{"className":141,"code":2275,"language":143,"meta":144,"style":144},"*/10 * * * * /bin/sh /tmp/temp_script.sh\n",[25,2277,2278],{"__ignoreMap":144},[148,2279,2280,2283,2286,2288,2291,2293,2295],{"class":150,"line":151},[148,2281,2282],{"class":275},"*",[148,2284,2285],{"class":348},"/10 ",[148,2287,2282],{"class":275},[148,2289,2290],{"class":275}," *",[148,2292,2290],{"class":275},[148,2294,2290],{"class":275},[148,2296,2297],{"class":348}," /bin/sh /tmp/temp_script.sh\n",[21,2299,2300,2301,2303],{},"Или используйте стандартную утилиту ",[25,2302,2263],{}," для каталогов:",[139,2305,2307],{"className":141,"code":2306,"language":143,"meta":144,"style":144},"0 * * * * /usr/bin/run-parts /etc/cron.hourly\n",[25,2308,2309],{"__ignoreMap":144},[148,2310,2311,2314,2316,2318,2320,2322,2325],{"class":150,"line":151},[148,2312,2313],{"class":161},"0",[148,2315,2290],{"class":220},[148,2317,2290],{"class":220},[148,2319,2290],{"class":220},[148,2321,2290],{"class":220},[148,2323,2324],{"class":165}," /usr/bin/run-parts",[148,2326,2327],{"class":165}," /etc/cron.hourly\n",[21,2329,2330],{},"Этот метод автоматически применяет стандартные политики запуска и упрощает аудит задач.",[16,2332,467],{"id":466},[21,2334,2335],{},"Чтобы ошибка не возвращалась, придерживайтесь нескольких простых правил при настройке автоматизации:",[420,2337,2338,2348,2358,2364,2373],{},[62,2339,2340,2341,75,2344,2347],{},"Храните скрипты в выделенных каталогах, например ",[25,2342,2343],{},"/opt/scripts/",[25,2345,2346],{},"/usr/local/bin/",", где права наследуются предсказуемо.",[62,2349,2350,2351,75,2354,2357],{},"Добавляйте в начало каждого скрипта ",[25,2352,2353],{},"#!/usr/bin/env bash",[25,2355,2356],{},"#!/bin/sh",", чтобы система точно знала, какой интерпретатор использовать.",[62,2359,2360,2361,2363],{},"Не монтируйте каталоги с флагом ",[25,2362,1985],{},", если в них планируются автоматические запуски.",[62,2365,2366,2367,75,2370,93],{},"Регулярно проверяйте логи планировщика: ",[25,2368,2369],{},"sudo journalctl -u cron -f",[25,2371,2372],{},"sudo journalctl -u crond -f",[62,2374,2375,2376,93],{},"Перед добавлением в расписание всегда тестируйте команду вручную от имени того пользователя, под которым она будет работать: ",[25,2377,2378],{},"su - username -c \"/usr/bin/bash /opt/scripts/test.sh\"",[527,2380,2381],{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":144,"searchDepth":158,"depth":158,"links":2383},[2384,2385,2386,2393],{"id":1908,"depth":158,"text":1909},{"id":53,"depth":158,"text":54},{"id":121,"depth":158,"text":122,"children":2387},[2388,2389,2390,2391],{"id":1997,"depth":172,"text":1998},{"id":2078,"depth":172,"text":2079},{"id":2123,"depth":172,"text":2124},{"id":2259,"depth":172,"text":2392},"Способ 4: Запуск через run-parts или оболочку sh",{"id":466,"depth":158,"text":467},"PERM_DENIED","2026-04-06 16:12:09","Скрипт в cron завершается с ошибкой доступа? Разбираем точные причины, корректируем права и настраиваем SELinux. Готовые инструкции за 5 минут.","easy","5-15 мин",[2400,2402,2405],{"question":553,"answer":2401},"Cron использует минимальное системное окружение и запускается от другого пользователя. Укажите абсолютные пути, добавьте полный путь к интерпретатору и проверьте права на исполнение.",{"question":2403,"answer":2404},"Как узнать, от какого имени выполняется задача cron?","Добавьте команду `whoami > /tmp/cron_user.log` в начало задачи или проверьте системный журнал `/var/log/syslog` (для Ubuntu/Debian) и `/var/log/cron` (для RHEL).",{"question":2406,"answer":2407},"Влияет ли SELinux на ошибку доступа в cron?","Да, в режиме Enforcing политика безопасности может блокировать выполнение скриптов из нестандартных каталог или доступ к сетевым ресурсам. Проверьте статус через `sestatus`.",[2409,2412,2415,2418],{"name":2410,"text":2411},"Проверка прав доступа","Выполните `ls -l /путь/к/скрипту.sh`, убедитесь в наличии бита исполнения (`x`) и корректном владельце файла.",{"name":2413,"text":2414},"Назначение прав и владельца","Используйте `chmod +x /путь/к/скрипту.sh` и `chown пользователь:группа /путь/к/скрипту.sh`, чтобы синхронизировать доступ с учётной записью cron.",{"name":2416,"text":2417},"Использование абсолютных путей","В crontab замените все относительные пути на полные, например: `/usr/bin/bash /opt/scripts/backup.sh`, так как cron не загружает переменные `$PATH`.",{"name":2419,"text":2420},"Проверка политик безопасности","Для SELinux выполните `ausearch -m AVC -ts recent` и при необходимости скорректируйте контекст командой `chcon -t bin_t /путь/к/скрипту.sh`.","PT10M",[2423,2424,2425,2426,2427,2428,2429,2430],"ошибка permission denied в cron","крон пишет permission denied","cron job не запускается linux","права на скрипт для cron","chown chmod для cron","selinux блокирует cron","cron exit code 126","почему не работает crontab",{},[2433,2434,2435],"/guides/linux/setup-automated-tasks","/errors/linux/cron-output-missing","/guides/linux/selinux-basics",{"title":1900,"description":2396},"errors/linux/permission-denied-cron","Ошибка Permission denied в cron возникает при отсутствии прав на выполнение скрипта или доступ к файлам. В этом руководстве вы узнаете, как быстро диагностировать проблему и вернуть автоматические задачи в рабочее состояние.",[596,2440,2441,2442,2038,2443,2444,1894],"Cron","Bash","разрешения файлов","chown","selinux","Ry8rIBIv8zFFlekw83g2gwGacqEwSh_sJzL6FXS1MsQ"]