[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"page-ru-/guides/linux/systemd-timers-migration":3,"mdc-9fvvsx-key":1156,"mdc--3m2wk7-key":1189,"mdc--lmff75-key":1219,"mdc--hfvhlt-key":1244,"mdc-xyrcwa-key":1268,"mdc-7ioxxe-key":1300,"mdc-jkkct7-key":1338,"mdc--2ghc1k-key":1381,"mdc-w3cdl7-key":1413,"related-/guides/linux/systemd-service-basics,/guides/linux/cron-troubleshooting,/errors/linux/systemd-timer-failed":1466},{"id":4,"title":5,"appliesTo":6,"author":12,"body":13,"canonical":1090,"code":1090,"createdAt":1091,"description":1092,"difficulty":1093,"draft":1094,"estimatedTime":1095,"extension":1096,"faq":1097,"howToSteps":1110,"howToTotalTime":1126,"image":1090,"keywords":1127,"locale":1136,"meta":1137,"navigation":130,"path":1138,"platform":1139,"related":1140,"section":1143,"seo":1144,"severity":1090,"stem":1145,"summary":1146,"tags":1147,"twitterCreator":1090,"twitterSite":1090,"type":1154,"updatedAt":1091,"__hash__":1155},"content_ru/guides/linux/systemd-timers-migration.md","Миграция с cron на systemd таймеры: полное руководство по замене",[7,8,9,10,11],"systemd 235+","Ubuntu 20.04+","Debian 11+","RHEL/CentOS 8+","Fedora 32+","FixPedia Team",{"type":14,"value":15,"toc":1069},"minimark",[16,21,47,51,89,93,96,171,174,205,214,222,226,237,362,382,386,396,482,490,516,520,523,604,612,618,622,627,640,669,673,683,745,749,754,782,786,879,883,910,929,952,970,973,977,981,986,1000,1003,1007,1014,1027,1030,1034,1039,1054,1058,1065],[17,18,20],"h2",{"id":19},"введение-зачем-это-нужно","Введение / Зачем это нужно",[22,23,24,25,29,30,33,34,38,39,42,43,46],"p",{},"Cron — проверенный временем планировщик, но systemd таймеры предлагают современную альтернативу с ",[26,27,28],"strong",{},"лучшей интеграцией в систему",", ",[26,31,32],{},"централизованным логированием"," через ",[35,36,37],"code",{},"journalctl"," и ",[26,40,41],{},"более гибким синтаксисом расписания",". Миграция позволит вам контролировать задачи через ",[35,44,45],{},"systemctl",", настраивать зависимости от других сервисов и избегать проблем с окружением. После выполнения этого гайда ваши автоматические задачи будут управляться единообразно со всеми системными сервисами.",[17,48,50],{"id":49},"требования-подготовка","Требования / Подготовка",[52,53,54,61,71,77],"ol",{},[55,56,57,60],"li",{},[26,58,59],{},"Система с systemd",": virtually все современные дистрибутивы Linux (Ubuntu 20.04+, Debian 11+, RHEL 8+).",[55,62,63,66,67,70],{},[26,64,65],{},"Права администратора (root или sudo)"," для создания файлов в ",[35,68,69],{},"/etc/systemd/system/"," и управления сервисами.",[55,72,73,76],{},[26,74,75],{},"Доступ к существующим cron-задачам",": знание их расписания и выполняемых команд.",[55,78,79,82,83,88],{},[26,80,81],{},"Базовое понимание systemd",": рекомендуется предварительно ознакомиться с ",[84,85,87],"a",{"href":86},"/guides/linux/systemd-service-basics","основами systemd сервисов",".",[17,90,92],{"id":91},"шаг-1-анализ-существующих-cron-задач","Шаг 1: Анализ существующих cron-задач",[22,94,95],{},"Прежде чем создавать новые юнит-файлы, полностью документируйте каждую cron-задачу.",[97,98,103],"pre",{"className":99,"code":100,"language":101,"meta":102,"style":102},"language-bash shiki shiki-themes github-light github-dark","# Просмотр cron-задач текущего пользователя\ncrontab -l\n\n# Просмотр системных cron-задач (требует sudo)\nsudo cat /etc/crontab\nsudo ls -la /etc/cron.d/ /etc/cron.hourly/ /etc/cron.daily/\n","bash","",[35,104,105,114,125,132,138,151],{"__ignoreMap":102},[106,107,110],"span",{"class":108,"line":109},"line",1,[106,111,113],{"class":112},"sJ8bj","# Просмотр cron-задач текущего пользователя\n",[106,115,117,121],{"class":108,"line":116},2,[106,118,120],{"class":119},"sScJk","crontab",[106,122,124],{"class":123},"sj4cs"," -l\n",[106,126,128],{"class":108,"line":127},3,[106,129,131],{"emptyLinePlaceholder":130},true,"\n",[106,133,135],{"class":108,"line":134},4,[106,136,137],{"class":112},"# Просмотр системных cron-задач (требует sudo)\n",[106,139,141,144,148],{"class":108,"line":140},5,[106,142,143],{"class":119},"sudo",[106,145,147],{"class":146},"sZZnC"," cat",[106,149,150],{"class":146}," /etc/crontab\n",[106,152,154,156,159,162,165,168],{"class":108,"line":153},6,[106,155,143],{"class":119},[106,157,158],{"class":146}," ls",[106,160,161],{"class":123}," -la",[106,163,164],{"class":146}," /etc/cron.d/",[106,166,167],{"class":146}," /etc/cron.hourly/",[106,169,170],{"class":146}," /etc/cron.daily/\n",[22,172,173],{},"Для каждой задачи запишите:",[175,176,177,187,193,199],"ul",{},[55,178,179,182,183,186],{},[26,180,181],{},"Расписание"," (например, ",[35,184,185],{},"0 2 * * *"," — каждый день в 2:00).",[55,188,189,192],{},[26,190,191],{},"Выполняемую команду"," и её аргументы.",[55,194,195,198],{},[26,196,197],{},"Пользователя",", от которого она запускается (для системных crontab).",[55,200,201,204],{},[26,202,203],{},"Необходимые переменные окружения"," (если есть).",[22,206,207],{},[26,208,209,210,213],{},"Пример мигрируемой задачи из ",[35,211,212],{},"/etc/crontab",":",[97,215,220],{"className":216,"code":218,"language":219},[217],"language-text","0 3 * * * root /usr/local/bin/backup.sh --rotate --compress\n","text",[35,221,218],{"__ignoreMap":102},[17,223,225],{"id":224},"шаг-2-создание-юнит-файла-сервиса-service","Шаг 2: Создание юнит-файла сервиса (.service)",[22,227,228,229,233,234,88],{},"Сервисный файл описывает, ",[230,231,232],"em",{},"что"," выполнять. Создайте файл ",[35,235,236],{},"/etc/systemd/system/backup.service",[97,238,242],{"className":239,"code":240,"language":241,"meta":102,"style":102},"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",[35,243,244,249,254,259,264,269,274,279,285,291,297,303,309,315,321,327,333,339,345,350,356],{"__ignoreMap":102},[106,245,246],{"class":108,"line":109},[106,247,248],{},"[Unit]\n",[106,250,251],{"class":108,"line":116},[106,252,253],{},"Description=Ежедневное резервное копирование данных\n",[106,255,256],{"class":108,"line":127},[106,257,258],{},"Documentation=man:backup.sh(8)\n",[106,260,261],{"class":108,"line":134},[106,262,263],{},"# Зависит от сети, если скрипт работает по сети\n",[106,265,266],{"class":108,"line":140},[106,267,268],{},"After=network-online.target\n",[106,270,271],{"class":108,"line":153},[106,272,273],{},"Wants=network-online.target\n",[106,275,277],{"class":108,"line":276},7,[106,278,131],{"emptyLinePlaceholder":130},[106,280,282],{"class":108,"line":281},8,[106,283,284],{},"[Service]\n",[106,286,288],{"class":108,"line":287},9,[106,289,290],{},"Type=oneshot\n",[106,292,294],{"class":108,"line":293},10,[106,295,296],{},"# Команда из cron\n",[106,298,300],{"class":108,"line":299},11,[106,301,302],{},"ExecStart=/usr/local/bin/backup.sh --rotate --compress\n",[106,304,306],{"class":108,"line":305},12,[106,307,308],{},"# Если нужно, укажите пользователя/группу (по умолчанию root)\n",[106,310,312],{"class":108,"line":311},13,[106,313,314],{},"# User=backupuser\n",[106,316,318],{"class":108,"line":317},14,[106,319,320],{},"# Group=backupgroup\n",[106,322,324],{"class":108,"line":323},15,[106,325,326],{},"# Импорт переменных окружения, если они были в crontab\n",[106,328,330],{"class":108,"line":329},16,[106,331,332],{},"# EnvironmentFile=/etc/default/backup\n",[106,334,336],{"class":108,"line":335},17,[106,337,338],{},"# Поведение при ошибках (по умолчанию restart=on-failure для не-oneshot)\n",[106,340,342],{"class":108,"line":341},18,[106,343,344],{},"# Restart=no\n",[106,346,348],{"class":108,"line":347},19,[106,349,131],{"emptyLinePlaceholder":130},[106,351,353],{"class":108,"line":352},20,[106,354,355],{},"[Install]\n",[106,357,359],{"class":108,"line":358},21,[106,360,361],{},"WantedBy=multi-user.target\n",[363,364,365],"blockquote",{},[22,366,367,368,371,372,375,376,379,380,88],{},"⚠️ ",[26,369,370],{},"Важно:"," Для разовых задач (",[35,373,374],{},"Type=oneshot",") systemd считает сервис завершённым после выполнения ",[35,377,378],{},"ExecStart",". Если нужно выполнить несколько команд, используйте скрипт или несколько ",[35,381,378],{},[17,383,385],{"id":384},"шаг-3-создание-юнит-файла-таймера-timer","Шаг 3: Создание юнит-файла таймера (.timer)",[22,387,388,389,392,393,88],{},"Таймерный файл описывает, ",[230,390,391],{},"когда"," запускать сервис. Создайте файл ",[35,394,395],{},"/etc/systemd/system/backup.timer",[97,397,399],{"className":239,"code":398,"language":241,"meta":102,"style":102},"[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",[35,400,401,405,410,415,420,424,429,434,439,444,449,454,459,464,469,473,477],{"__ignoreMap":102},[106,402,403],{"class":108,"line":109},[106,404,248],{},[106,406,407],{"class":108,"line":116},[106,408,409],{},"Description=Таймер для ежедневного резервного копирования\n",[106,411,412],{"class":108,"line":127},[106,413,414],{},"# Убедитесь, что сервис готов к запуску (опционально)\n",[106,416,417],{"class":108,"line":134},[106,418,419],{},"Requires=backup.service\n",[106,421,422],{"class":108,"line":140},[106,423,131],{"emptyLinePlaceholder":130},[106,425,426],{"class":108,"line":153},[106,427,428],{},"[Timer]\n",[106,430,431],{"class":108,"line":276},[106,432,433],{},"# Календарное расписание: каждый день в 3:00\n",[106,435,436],{"class":108,"line":281},[106,437,438],{},"OnCalendar=*-*-* 03:00:00\n",[106,440,441],{"class":108,"line":287},[106,442,443],{},"# Альтернатива: интервал от последнего успешного запуска\n",[106,445,446],{"class":108,"line":293},[106,447,448],{},"# OnUnitActiveSec=1d\n",[106,450,451],{"class":108,"line":299},[106,452,453],{},"# Что делать, если задача пропущена (например, при выключении ПК)\n",[106,455,456],{"class":108,"line":305},[106,457,458],{},"# Persistent=true\n",[106,460,461],{"class":108,"line":311},[106,462,463],{},"# Задержка случайная (anti-thundering herd), если нужно\n",[106,465,466],{"class":108,"line":317},[106,467,468],{},"# RandomizedDelaySec=10min\n",[106,470,471],{"class":108,"line":323},[106,472,131],{"emptyLinePlaceholder":130},[106,474,475],{"class":108,"line":329},[106,476,355],{},[106,478,479],{"class":108,"line":335},[106,480,481],{},"WantedBy=timers.target\n",[22,483,484,213],{},[26,485,486,487],{},"Синтаксис ",[35,488,489],{},"OnCalendar",[175,491,492,498,504,510],{},[55,493,494,497],{},[35,495,496],{},"*-*-* 03:00:00"," — ежедневно в 03:00.",[55,499,500,503],{},[35,501,502],{},"Mon *-*-* 02:30:00"," — каждый понедельник в 02:30.",[55,505,506,509],{},[35,507,508],{},"*-*-1 00:00:00"," — в первый день каждого месяца.",[55,511,512,515],{},[35,513,514],{},"00/30:00:00"," — каждые 30 минут (в 00 и 30 минут каждого часа).",[17,517,519],{"id":518},"шаг-4-активация-и-проверка-таймера","Шаг 4: Активация и проверка таймера",[22,521,522],{},"После создания файлов загрузите конфигурацию в systemd и активируйте таймер.",[97,524,526],{"className":99,"code":525,"language":101,"meta":102,"style":102},"# Перечитать конфигурации 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",[35,527,528,533,543,547,552,567,571,576,585,589,594],{"__ignoreMap":102},[106,529,530],{"class":108,"line":109},[106,531,532],{"class":112},"# Перечитать конфигурации systemd (обязательно после создания новых юнит-файлов)\n",[106,534,535,537,540],{"class":108,"line":116},[106,536,143],{"class":119},[106,538,539],{"class":146}," systemctl",[106,541,542],{"class":146}," daemon-reload\n",[106,544,545],{"class":108,"line":127},[106,546,131],{"emptyLinePlaceholder":130},[106,548,549],{"class":108,"line":134},[106,550,551],{"class":112},"# Включить и сразу запустить таймер\n",[106,553,554,556,558,561,564],{"class":108,"line":140},[106,555,143],{"class":119},[106,557,539],{"class":146},[106,559,560],{"class":146}," enable",[106,562,563],{"class":123}," --now",[106,565,566],{"class":146}," backup.timer\n",[106,568,569],{"class":108,"line":153},[106,570,131],{"emptyLinePlaceholder":130},[106,572,573],{"class":108,"line":276},[106,574,575],{"class":112},"# Проверить статус таймера\n",[106,577,578,580,583],{"class":108,"line":281},[106,579,45],{"class":119},[106,581,582],{"class":146}," status",[106,584,566],{"class":146},[106,586,587],{"class":108,"line":287},[106,588,131],{"emptyLinePlaceholder":130},[106,590,591],{"class":108,"line":293},[106,592,593],{"class":112},"# Посмотреть список всех активных таймеров\n",[106,595,596,598,601],{"class":108,"line":299},[106,597,45],{"class":119},[106,599,600],{"class":146}," list-timers",[106,602,603],{"class":123}," --all\n",[22,605,606,213],{},[26,607,608,609],{},"Пример вывода ",[35,610,611],{},"list-timers",[97,613,616],{"className":614,"code":615,"language":219},[217],"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",[35,617,615],{"__ignoreMap":102},[17,619,621],{"id":620},"шаг-5-миграция-сложных-сценариев","Шаг 5: Миграция сложных сценариев",[623,624,626],"h3",{"id":625},"задачи-с-переменными-окружения","Задачи с переменными окружения",[22,628,629,630,29,633,636,637,213],{},"Если в cron использовались переменные (",[35,631,632],{},"PATH",[35,634,635],{},"MAILTO"," и т.д.), перенесите их в секцию ",[35,638,639],{},"[Service]",[97,641,643],{"className":239,"code":642,"language":241,"meta":102,"style":102},"[Service]\nEnvironment=\"PATH=/usr/local/sbin:/usr/local/bin\"\nEnvironment=\"BACKUP_DIR=/var/backups\"\n# Или импортируйте из файла\nEnvironmentFile=/etc/sysconfig/backup\n",[35,644,645,649,654,659,664],{"__ignoreMap":102},[106,646,647],{"class":108,"line":109},[106,648,284],{},[106,650,651],{"class":108,"line":116},[106,652,653],{},"Environment=\"PATH=/usr/local/sbin:/usr/local/bin\"\n",[106,655,656],{"class":108,"line":127},[106,657,658],{},"Environment=\"BACKUP_DIR=/var/backups\"\n",[106,660,661],{"class":108,"line":134},[106,662,663],{},"# Или импортируйте из файла\n",[106,665,666],{"class":108,"line":140},[106,667,668],{},"EnvironmentFile=/etc/sysconfig/backup\n",[623,670,672],{"id":671},"задачи-запускаемые-от-не-root-пользователя","Задачи, запускаемые от не-root пользователя",[22,674,675,676,679,680,213],{},"Создайте юнит-файлы в домашней директории пользователя (",[35,677,678],{},"~/.config/systemd/user/",") и используйте ",[35,681,682],{},"systemctl --user",[97,684,686],{"className":99,"code":685,"language":101,"meta":102,"style":102},"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",[35,687,688,699,704,713,726,731],{"__ignoreMap":102},[106,689,690,693,696],{"class":108,"line":109},[106,691,692],{"class":119},"mkdir",[106,694,695],{"class":123}," -p",[106,697,698],{"class":146}," ~/.config/systemd/user/\n",[106,700,701],{"class":108,"line":116},[106,702,703],{"class":112},"# Копируем .service и .timer файлы в эту директорию\n",[106,705,706,708,711],{"class":108,"line":127},[106,707,45],{"class":119},[106,709,710],{"class":123}," --user",[106,712,542],{"class":146},[106,714,715,717,719,721,723],{"class":108,"line":134},[106,716,45],{"class":119},[106,718,710],{"class":123},[106,720,560],{"class":146},[106,722,563],{"class":123},[106,724,725],{"class":146}," mytask.timer\n",[106,727,728],{"class":108,"line":140},[106,729,730],{"class":112},"# Включите lingering для автозапуска без входа в систему\n",[106,732,733,735,738,741],{"class":108,"line":153},[106,734,143],{"class":119},[106,736,737],{"class":146}," loginctl",[106,739,740],{"class":146}," enable-linger",[106,742,744],{"class":743},"sVt8B"," $USER\n",[623,746,748],{"id":747},"задачи-с-несколькими-командами","Задачи с несколькими командами",[22,750,751,752,213],{},"Вынесите команды в отдельный скрипт (как в примере выше) или используйте несколько ",[35,753,378],{},[97,755,757],{"className":239,"code":756,"language":241,"meta":102,"style":102},"[Service]\nType=oneshot\nExecStart=/usr/bin/step1.sh\nExecStart=/usr/bin/step2.sh\nRemainAfterExit=yes  # Сервис считается активным после завершения\n",[35,758,759,763,767,772,777],{"__ignoreMap":102},[106,760,761],{"class":108,"line":109},[106,762,284],{},[106,764,765],{"class":108,"line":116},[106,766,290],{},[106,768,769],{"class":108,"line":127},[106,770,771],{},"ExecStart=/usr/bin/step1.sh\n",[106,773,774],{"class":108,"line":134},[106,775,776],{},"ExecStart=/usr/bin/step2.sh\n",[106,778,779],{"class":108,"line":140},[106,780,781],{},"RemainAfterExit=yes  # Сервис считается активным после завершения\n",[17,783,785],{"id":784},"проверка-результата","Проверка результата",[52,787,788,837,870],{},[55,789,790,793,794,797,798,801,802],{},[26,791,792],{},"Логирование",": все выводы ",[35,795,796],{},"stdout","/",[35,799,800],{},"stderr"," сервиса попадают в журнал systemd. Просмотрите их:\n",[97,803,805],{"className":99,"code":804,"language":101,"meta":102,"style":102},"journalctl -u backup.service -b  # Логи последней загрузки\njournalctl -u backup.service --since \"1 hour ago\"\n",[35,806,807,823],{"__ignoreMap":102},[106,808,809,811,814,817,820],{"class":108,"line":109},[106,810,37],{"class":119},[106,812,813],{"class":123}," -u",[106,815,816],{"class":146}," backup.service",[106,818,819],{"class":123}," -b",[106,821,822],{"class":112},"  # Логи последней загрузки\n",[106,824,825,827,829,831,834],{"class":108,"line":116},[106,826,37],{"class":119},[106,828,813],{"class":123},[106,830,816],{"class":146},[106,832,833],{"class":123}," --since",[106,835,836],{"class":146}," \"1 hour ago\"\n",[55,838,839,842,843],{},[26,840,841],{},"Тестовый запуск",": принудительно запустите сервис, чтобы убедиться в работоспособности команды:\n",[97,844,846],{"className":99,"code":845,"language":101,"meta":102,"style":102},"sudo systemctl start backup.service\nsudo systemctl status backup.service\n",[35,847,848,860],{"__ignoreMap":102},[106,849,850,852,854,857],{"class":108,"line":109},[106,851,143],{"class":119},[106,853,539],{"class":146},[106,855,856],{"class":146}," start",[106,858,859],{"class":146}," backup.service\n",[106,861,862,864,866,868],{"class":108,"line":116},[106,863,143],{"class":119},[106,865,539],{"class":146},[106,867,582],{"class":146},[106,869,859],{"class":146},[55,871,872,874,875,878],{},[26,873,181],{},": убедитесь, что таймер корректно вычисляет следующее время запуска (",[35,876,877],{},"systemctl list-timers",").",[17,880,882],{"id":881},"возможные-проблемы","Возможные проблемы",[363,884,885],{},[22,886,887,890,891,894,895,898,899,902,903,906,907,88],{},[26,888,889],{},"Таймер не активируется после перезагрузки","\nУбедитесь, что таймер ",[26,892,893],{},"включен"," (",[35,896,897],{},"systemctl is-enabled backup.timer"," должен вернуть ",[35,900,901],{},"enabled","). Если ",[35,904,905],{},"disabled",", выполните ",[35,908,909],{},"systemctl enable backup.timer",[363,911,912],{},[22,913,914,917,918,921,922,925,926,878],{},[26,915,916],{},"Сервис завершается с ошибкой, но таймер продолжает работать","\nПо умолчанию systemd считает таймер активным, даже если сервис упал. Чтобы таймер отключался при сбое, добавьте в ",[35,919,920],{},"[Timer]",": ",[35,923,924],{},"FailureAction=stop",". Также проверьте логи сервиса (",[35,927,928],{},"journalctl -u backup.service",[363,930,931],{},[22,932,933,936,937,940,941,943,944,947,948,951],{},[26,934,935],{},"Расписание срабатывает не в то время","\nПроверьте часовой пояс системы (",[35,938,939],{},"timedatectl",") и синтаксис ",[35,942,489],{},". Учтите, что ",[35,945,946],{},"OnUnitActiveSec"," считает интервал от ",[26,949,950],{},"последнего успешного запуска",", а не от запланированного.",[363,953,954],{},[22,955,956,959,960,962,963,966,967,88],{},[26,957,958],{},"Не работают переменные окружения из crontab","\nCron автоматически устанавливает минимальный ",[35,961,632],{}," и другие переменные. В systemd их нужно задавать явно через ",[35,964,965],{},"Environment"," или ",[35,968,969],{},"EnvironmentFile",[971,972],"in-article-ad",{},[17,974,976],{"id":975},"дополнительные-настройки","Дополнительные настройки",[623,978,980],{"id":979},"отложенный-запуск-randomizeddelaysec","Отложенный запуск (RandomizedDelaySec)",[22,982,983,984,213],{},"Для распределения нагрузки добавьте в ",[35,985,920],{},[97,987,989],{"className":239,"code":988,"language":241,"meta":102,"style":102},"RandomizedDelaySec=15min\nOnCalendar=*-*-* 03:00:00\n",[35,990,991,996],{"__ignoreMap":102},[106,992,993],{"class":108,"line":109},[106,994,995],{},"RandomizedDelaySec=15min\n",[106,997,998],{"class":108,"line":116},[106,999,438],{},[22,1001,1002],{},"Это запустит задачу в случайный момент в интервале 03:00–03:15.",[623,1004,1006],{"id":1005},"запуск-только-при-наличии-сети","Запуск только при наличии сети",[22,1008,1009,1010,1013],{},"Если задача требует интернета, добавьте в ",[35,1011,1012],{},"[Unit]"," сервиса:",[97,1015,1017],{"className":239,"code":1016,"language":241,"meta":102,"style":102},"After=network-online.target\nWants=network-online.target\n",[35,1018,1019,1023],{"__ignoreMap":102},[106,1020,1021],{"class":108,"line":109},[106,1022,268],{},[106,1024,1025],{"class":108,"line":116},[106,1026,273],{},[22,1028,1029],{},"Это гарантирует запуск только после полного поднятия сети.",[623,1031,1033],{"id":1032},"ограничение-времени-выполнения","Ограничение времени выполнения",[22,1035,1036,1037,213],{},"Чтобы задача не висела вечно, задайте таймаут в ",[35,1038,639],{},[97,1040,1042],{"className":239,"code":1041,"language":241,"meta":102,"style":102},"TimeoutStartSec=1h  # Прервать, если не завершится за час\nTimeoutStopSec=5min\n",[35,1043,1044,1049],{"__ignoreMap":102},[106,1045,1046],{"class":108,"line":109},[106,1047,1048],{},"TimeoutStartSec=1h  # Прервать, если не завершится за час\n",[106,1050,1051],{"class":108,"line":116},[106,1052,1053],{},"TimeoutStopSec=5min\n",[17,1055,1057],{"id":1056},"заключение","Заключение",[22,1059,1060,1061,1064],{},"Миграция с cron на systemd таймеры — это ",[26,1062,1063],{},"инвестицию в стабильность и управляемость"," вашей системы. Вы получаете единый инструмент для всех периодических задач, детальное логирование и возможность построения сложных зависимостей. Начните с одной не критичной задачи, протестируйте её, и постепенно переносите остальные.",[1066,1067,1068],"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 .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":102,"searchDepth":116,"depth":116,"links":1070},[1071,1072,1073,1074,1075,1076,1077,1082,1083,1084,1089],{"id":19,"depth":116,"text":20},{"id":49,"depth":116,"text":50},{"id":91,"depth":116,"text":92},{"id":224,"depth":116,"text":225},{"id":384,"depth":116,"text":385},{"id":518,"depth":116,"text":519},{"id":620,"depth":116,"text":621,"children":1078},[1079,1080,1081],{"id":625,"depth":127,"text":626},{"id":671,"depth":127,"text":672},{"id":747,"depth":127,"text":748},{"id":784,"depth":116,"text":785},{"id":881,"depth":116,"text":882},{"id":975,"depth":116,"text":976,"children":1085},[1086,1087,1088],{"id":979,"depth":127,"text":980},{"id":1005,"depth":127,"text":1006},{"id":1032,"depth":127,"text":1033},{"id":1056,"depth":116,"text":1057},null,"2026-04-08 18:35:03","Пошаговая инструкция по миграции cron-задач на systemd таймеры в Linux. Узнайте преимущества, напишите юнит-файлы и настройте автоматизацию без потерь. Готовые примеры для Ubuntu/Debian и RHEL.","medium",false,"15-30 мин","md",[1098,1101,1104,1107],{"question":1099,"answer":1100},"Что делать, если systemd таймер не запускается по расписанию?","Проверьте статус таймера командой `systemctl list-timers --all`, убедитесь, что он активен (`enabled`). Также проверьте журнал: `journalctl -u имя_сервиса.timer -b`.",{"question":1102,"answer":1103},"Можно ли использовать переменные окружения из crontab в systemd?","Да, но их нужно явно объявить в юнит-файле сервиса в секции `[Service]` через `Environment=\"VAR=value\"` или импортировать из файла через `EnvironmentFile=/etc/default/имя_сервиса`.",{"question":1105,"answer":1106},"Как перенести задачу, которая запускается каждые 5 минут?","В юнит-файле таймера укажите `OnUnitActiveSec=5min` для интервала от последнего запуска или `OnCalendar=*:0/5` для календарного расписания (каждые 5 минут, в 0,5,10... минут каждого часа).",{"question":1108,"answer":1109},"Нужно ли перезагружать систему после создания юнит-файлов?","Нет. После копирования файлов в `/etc/systemd/system/` выполните `systemctl daemon-reload`, чтобы systemd прочитал новые конфигурации.",[1111,1114,1117,1120,1123],{"name":1112,"text":1113},"Анализ существующих cron-задач","Просмотрите текущие задачи с помощью `crontab -l` (для текущего пользователя) или `cat /etc/crontab` и `ls /etc/cron.*`. Запишите расписание, команды и аргументы.",{"name":1115,"text":1116},"Создание юнит-файла сервиса (.service)","Создайте файл `/etc/systemd/system/имя_сервиса.service`. В секции `[Service]` укажите `ExecStart` с командой из cron. Добавьте `Type=oneshot` для разовых задач.",{"name":1118,"text":1119},"Создание юнит-файла таймера (.timer)","Создайте файл `/etc/systemd/system/имя_сервиса.timer`. В секции `[Timer]` определите расписание через `OnCalendar` (календарное) или `OnUnitActiveSec` (интервал). Свяжите с сервисом через `Unit=имя_сервиса.service`.",{"name":1121,"text":1122},"Активация и запуск таймера","Включите автозапуск таймера: `systemctl enable --now имя_сервиса.timer`. Флаг `--now` запускает его немедленно. Проверьте статус: `systemctl status имя_сервиса.timer`.",{"name":1124,"text":1125},"Перенос сложных cron-задач","Для задач с зависимостями или окружением используйте секции `[Service]`: `User=`/`Group=` для смены пользователя, `EnvironmentFile=` для переменных, `After=`/`Requires=` для зависимостей от других сервисов.","PT20M",[1128,1129,1130,1131,1132,1133,1134,1135],"миграция cron на systemd таймеры","замена cron на systemd","systemd timer вместо cron","как перенести cron задачу в systemd","cron migration to systemd timer","ошибка cron не запускается systemd","настройка systemd timer пример","systemd timer vs cron","ru_RU",{},"/guides/linux/systemd-timers-migration","linux",[86,1141,1142],"/guides/linux/cron-troubleshooting","/errors/linux/systemd-timer-failed","Гайды Linux",{"title":5,"description":1092},"guides/linux/systemd-timers-migration","Это руководство поможет вам перевести существующие cron-задачи на современные systemd таймеры. Вы получите более гибкое управление, логирование и интеграцию с системой, сохранив всю функциональность.",[1148,1149,1150,1151,1152,1153,120],"гайды linux","systemd","cron","автоматизация","администрирование","systemd-timer","guide","5THt0jxHMVTdUhoFajRzsfqEMRKeuwK0CVH6cRODgOI",{"data":1157,"body":1158},{},{"type":1159,"children":1160},"root",[1161],{"type":1162,"tag":22,"props":1163,"children":1164},"element",{},[1165,1167,1173,1175,1180,1182,1188],{"type":219,"value":1166},"Проверьте статус таймера командой ",{"type":1162,"tag":35,"props":1168,"children":1170},{"className":1169},[],[1171],{"type":219,"value":1172},"systemctl list-timers --all",{"type":219,"value":1174},", убедитесь, что он активен (",{"type":1162,"tag":35,"props":1176,"children":1178},{"className":1177},[],[1179],{"type":219,"value":901},{"type":219,"value":1181},"). Также проверьте журнал: ",{"type":1162,"tag":35,"props":1183,"children":1185},{"className":1184},[],[1186],{"type":219,"value":1187},"journalctl -u имя_сервиса.timer -b",{"type":219,"value":88},{"data":1190,"body":1191},{},{"type":1159,"children":1192},[1193],{"type":1162,"tag":22,"props":1194,"children":1195},{},[1196,1198,1203,1204,1210,1212,1218],{"type":219,"value":1197},"Да, но их нужно явно объявить в юнит-файле сервиса в секции ",{"type":1162,"tag":35,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":219,"value":639},{"type":219,"value":33},{"type":1162,"tag":35,"props":1205,"children":1207},{"className":1206},[],[1208],{"type":219,"value":1209},"Environment=\"VAR=value\"",{"type":219,"value":1211}," или импортировать из файла через ",{"type":1162,"tag":35,"props":1213,"children":1215},{"className":1214},[],[1216],{"type":219,"value":1217},"EnvironmentFile=/etc/default/имя_сервиса",{"type":219,"value":88},{"data":1220,"body":1221},{},{"type":1159,"children":1222},[1223],{"type":1162,"tag":22,"props":1224,"children":1225},{},[1226,1228,1234,1236,1242],{"type":219,"value":1227},"В юнит-файле таймера укажите ",{"type":1162,"tag":35,"props":1229,"children":1231},{"className":1230},[],[1232],{"type":219,"value":1233},"OnUnitActiveSec=5min",{"type":219,"value":1235}," для интервала от последнего запуска или ",{"type":1162,"tag":35,"props":1237,"children":1239},{"className":1238},[],[1240],{"type":219,"value":1241},"OnCalendar=*:0/5",{"type":219,"value":1243}," для календарного расписания (каждые 5 минут, в 0,5,10... минут каждого часа).",{"data":1245,"body":1246},{},{"type":1159,"children":1247},[1248],{"type":1162,"tag":22,"props":1249,"children":1250},{},[1251,1253,1258,1260,1266],{"type":219,"value":1252},"Нет. После копирования файлов в ",{"type":1162,"tag":35,"props":1254,"children":1256},{"className":1255},[],[1257],{"type":219,"value":69},{"type":219,"value":1259}," выполните ",{"type":1162,"tag":35,"props":1261,"children":1263},{"className":1262},[],[1264],{"type":219,"value":1265},"systemctl daemon-reload",{"type":219,"value":1267},", чтобы systemd прочитал новые конфигурации.",{"data":1269,"body":1270},{},{"type":1159,"children":1271},[1272],{"type":1162,"tag":22,"props":1273,"children":1274},{},[1275,1277,1283,1285,1291,1292,1298],{"type":219,"value":1276},"Просмотрите текущие задачи с помощью ",{"type":1162,"tag":35,"props":1278,"children":1280},{"className":1279},[],[1281],{"type":219,"value":1282},"crontab -l",{"type":219,"value":1284}," (для текущего пользователя) или ",{"type":1162,"tag":35,"props":1286,"children":1288},{"className":1287},[],[1289],{"type":219,"value":1290},"cat /etc/crontab",{"type":219,"value":38},{"type":1162,"tag":35,"props":1293,"children":1295},{"className":1294},[],[1296],{"type":219,"value":1297},"ls /etc/cron.*",{"type":219,"value":1299},". Запишите расписание, команды и аргументы.",{"data":1301,"body":1302},{},{"type":1159,"children":1303},[1304],{"type":1162,"tag":22,"props":1305,"children":1306},{},[1307,1309,1315,1317,1322,1324,1329,1331,1336],{"type":219,"value":1308},"Создайте файл ",{"type":1162,"tag":35,"props":1310,"children":1312},{"className":1311},[],[1313],{"type":219,"value":1314},"/etc/systemd/system/имя_сервиса.service",{"type":219,"value":1316},". В секции ",{"type":1162,"tag":35,"props":1318,"children":1320},{"className":1319},[],[1321],{"type":219,"value":639},{"type":219,"value":1323}," укажите ",{"type":1162,"tag":35,"props":1325,"children":1327},{"className":1326},[],[1328],{"type":219,"value":378},{"type":219,"value":1330}," с командой из cron. Добавьте ",{"type":1162,"tag":35,"props":1332,"children":1334},{"className":1333},[],[1335],{"type":219,"value":374},{"type":219,"value":1337}," для разовых задач.",{"data":1339,"body":1340},{},{"type":1159,"children":1341},[1342],{"type":1162,"tag":22,"props":1343,"children":1344},{},[1345,1346,1352,1353,1358,1360,1365,1367,1372,1374,1380],{"type":219,"value":1308},{"type":1162,"tag":35,"props":1347,"children":1349},{"className":1348},[],[1350],{"type":219,"value":1351},"/etc/systemd/system/имя_сервиса.timer",{"type":219,"value":1316},{"type":1162,"tag":35,"props":1354,"children":1356},{"className":1355},[],[1357],{"type":219,"value":920},{"type":219,"value":1359}," определите расписание через ",{"type":1162,"tag":35,"props":1361,"children":1363},{"className":1362},[],[1364],{"type":219,"value":489},{"type":219,"value":1366}," (календарное) или ",{"type":1162,"tag":35,"props":1368,"children":1370},{"className":1369},[],[1371],{"type":219,"value":946},{"type":219,"value":1373}," (интервал). Свяжите с сервисом через ",{"type":1162,"tag":35,"props":1375,"children":1377},{"className":1376},[],[1378],{"type":219,"value":1379},"Unit=имя_сервиса.service",{"type":219,"value":88},{"data":1382,"body":1383},{},{"type":1159,"children":1384},[1385],{"type":1162,"tag":22,"props":1386,"children":1387},{},[1388,1390,1396,1398,1404,1406,1412],{"type":219,"value":1389},"Включите автозапуск таймера: ",{"type":1162,"tag":35,"props":1391,"children":1393},{"className":1392},[],[1394],{"type":219,"value":1395},"systemctl enable --now имя_сервиса.timer",{"type":219,"value":1397},". Флаг ",{"type":1162,"tag":35,"props":1399,"children":1401},{"className":1400},[],[1402],{"type":219,"value":1403},"--now",{"type":219,"value":1405}," запускает его немедленно. Проверьте статус: ",{"type":1162,"tag":35,"props":1407,"children":1409},{"className":1408},[],[1410],{"type":219,"value":1411},"systemctl status имя_сервиса.timer",{"type":219,"value":88},{"data":1414,"body":1415},{},{"type":1159,"children":1416},[1417],{"type":1162,"tag":22,"props":1418,"children":1419},{},[1420,1422,1427,1428,1434,1435,1441,1443,1449,1451,1457,1458,1464],{"type":219,"value":1421},"Для задач с зависимостями или окружением используйте секции ",{"type":1162,"tag":35,"props":1423,"children":1425},{"className":1424},[],[1426],{"type":219,"value":639},{"type":219,"value":921},{"type":1162,"tag":35,"props":1429,"children":1431},{"className":1430},[],[1432],{"type":219,"value":1433},"User=",{"type":219,"value":797},{"type":1162,"tag":35,"props":1436,"children":1438},{"className":1437},[],[1439],{"type":219,"value":1440},"Group=",{"type":219,"value":1442}," для смены пользователя, ",{"type":1162,"tag":35,"props":1444,"children":1446},{"className":1445},[],[1447],{"type":219,"value":1448},"EnvironmentFile=",{"type":219,"value":1450}," для переменных, ",{"type":1162,"tag":35,"props":1452,"children":1454},{"className":1453},[],[1455],{"type":219,"value":1456},"After=",{"type":219,"value":797},{"type":1162,"tag":35,"props":1459,"children":1461},{"className":1460},[],[1462],{"type":219,"value":1463},"Requires=",{"type":219,"value":1465}," для зависимостей от других сервисов.",[]]