Как да тествате крон задача преди насроченото време

Как да тествате крон задача преди насроченото време

9 часа сутринта. Насрочили сте крон задача за архивиране на базата данни в 3 сутринта. Минали са шест часа. Изпълни ли се? Дали не се е „закъсала“ поради печатна грешка, която няма да откриете, докато не ви потрябва архивът?

Изглежда, че няма начин да разберете освен ако не изчакате до 3 сутринта на следващия ден и не проверите отново.

Всъщност има.

Може да стартирате крон задача при поискване, да наблюдавате точно какво прави и да я поправите, преди тя изобщо да засегне реалния си график. В много хостинг процеси тестването на крон задача все още означава чакане на насроченото време или ръчно изпълнение на командата през SSH.

В SPanel тестването на крон задачи не е само SSH workflow. Мениджърът на крон задачи (Cron Jobs Manager) ви позволява да стартирате запазеn kron proces веднага, след което показва комбинирания нормален изход и изхода при грешки след завършване на командата. Задачата се изпълнява под потребителя на вашия хостинг акаунт, а не под root. По подразбиране, SPanel изпълнява това без нотификация, освен ако не активирате известия по имейл. Тази комбинация прави всеки крон по-безопасен за тестване, по-лесен за отстраняване на грешки и по-малко вероятно да наводни пощенската ви кутия с ненужни съобщения.

Защо чакането на насроченото изпълнение е най-лошият начин да откриете грешка

Крон действа „тихо“ по дизайн. Той изпълнява командата ви в указаното време и освен ако не сте му казали друго, изпраща резултата никъде (или в локална пощенска кутия, която почти сигурно никога не проверявате). Така че когато задачата се провали, нищо не индикира това. Задачата просто не се случва.

Тази тишина е целият проблем.

Погрешно написан път към файл, скрипт, който вика грешна версия на езика, грешка в правата на папка – всяка от тях се проваля по същия тих начин. Задачата завършва, крон продължава нататък и вашият архив (или обработчик на опашка, или задача за почистване) просто не се е изпълнил. Разбирате го дни по-късно, обикновено в най-лошия възможен момент.

Ето какво – цената се натрупва. Задача, насрочена веднъж на ден, която е била счупена две седмици, означава четиринадесет пропуснати изпълнения, за които никой не е сигнализирал. Тестването преди първото насрочено изпълнение превръща цялата тази категория бавно натрупващи се failures в 30-секундна проверка.

Как да тествате крон задача преди насроченото време

Най-бързият начин да тествате крон задача е да я стартирате ръчно, при поискване, и да прочетете записания изход без да чакате насроченото време да настъпи. Стартирате командата, виждате точно какво отпечатва (включително всякакви грешки), поправяте каквото е счупено и едва тогава се доверявате на графика.

Тази единична възможност улавя failures, които иначе биха останали незабелязани дни наред. Ето как да я използвате.

Най-бързият начин – Стартирайте крон задачата ръчно

Ако вашият хостинг акаунт работи на SPanel, Мениджърът на крон задачи има лесен начин за ръчна проверка.

Ето стъпките:

  1. Влезте в SPanel и кликнете върху опцията Cron Jobs под Tools.
Как да тествате крон задача преди насроченото време, Най-бързият начин – Стартирайте крон задачата ръчно
  1. Вътре настройте крон задачата, като зададете командата и интервала, на който да се изпълнява. Кликнете върху синия бутон Create Cron Job.
Как да тествате крон задача преди насроченото време, Най-бързият начин – Стартирайте крон задачата ръчно 2
  1. След като задачата е конфигурирана, до реда й кликнете върху Actions -> Run Manually.
Как да тествате крон задача преди насроченото време, Най-бързият начин – Стартирайте крон задачата ръчно 3

Готово!

Ако задачата се изпълни нормално, ще получите потвърждение.

Как да тествате крон задача преди насроченото време, Най-бързият начин – Стартирайте крон задачата ръчно 4

Както нормалният изход, така и всички съобщения за грешки се записват и показват обратно в панела, след като командата завърши.

Никаква SSH сесия. Никакво ръчно редактиране на crontab файлове. Никакво чакане до 3 сутринта.

Няколко неща, които си струва да знаете за това как се държи:

  • Изходът се записва, не се показва в реално време. При дълго изпълняваща се команда виждате пълния изход едва когато завърши, а не ред по ред по време на изпълнението.
  • Изпълнява се във фонов режим. Панелът предава задачата и анкетира за резултата, така че сесията ви не застива в очакване на бавна команда.
  • Изпълнява се като вас. Ръчното стартиране се изпълнява под вашия собствен потребител на акаунта – точно както ще се изпълни и насрочената задача – така че това, което виждате, е достоверен предварителен преглед, а не приближение.

Как да прочетете изхода

Когато задачата завърши, гледате комбинирания нормален изход и изхода при грешки на вашата команда. Чистото изпълнение показва каквото командата е трябвало да отпечата (или нищо, ако задачата е тиха). Счупеното изпълнение показва грешката, а тя обикновено ви казва точно какво да поправите.

Най-често срещаните се четат ясно, след като сте ги видели няколко пъти: „No such file or directory“ означава, че пътят е грешен, „Permission denied“ означава, че скриптът или целевата папка има грешни права, а PHP или Python error trace означава, че командата е достигнала вашия код, но кодът е хвърлил грешка. Всяка сочи към конкретна поправка.

Ръчният път през SSH

Нямате контролен панел? Все пак можете да тествате командата директно. Свържете се през SSH и изпълнете точната команда от вашия крон ред в shell prompt-а:

/usr/bin/php /home/user/script.php

Едно важно предупреждение – и то обърква дори опитни разработчици. Вашият интерактивен shell има по-пълна среда от тази на cron (различни PATH, HOME и езикови настройки). Команда може да мине, когато я стартирате ръчно, но да се провали по график, защото cron работи в опростена среда.

Сравнение на методите за тестване:

Метод на тестванеНай-подходящ заОграничение
Ръчно изпълнение в SPanelТестване на запазена крон задача от панела и четене на записания изходИзходът се появява след завършване, не се излъчва на живо
Тест на команда през SSHДебъгване от разработчик с директен достъп до shellShell средата може да се различава от тази на cron
Изчакване на графикаПотвърждаване, че реалното насрочено изпълнение е станалоНай-бавно и най-лесно за пропускане, ако изходът е тих

Защо крон задачите могат да се провалят първия път

Повечето failures при първо изпълнение идват от кратък списък с обичайни заподозрени. Познаването им превръща „защо не работи?“ в бърз чеклист:

  1. Относителни пътища. Cron не стартира в домашната ви директория така, както shell-ът ви. Използвайте пълни, абсолютни пътища както за командата, така и за всички файлове, които тя обхваща.
  2. Грешен път към интерпретатора. Извикването на php може да работи в shell, но не и в cron. Използвайте пълния път – /usr/bin/php – за да знае cron точно какво да стартира.
  3. Права. Ако скриптът не е изпълним, или папката, в която пише, не е записваема от потребителя на вашия акаунт, задачата се проваля. Съобразете пермисиите с това, от което задачата действително се нуждае.
  4. Разлики в средата. Променливите, които shell-ът ви задава автоматично, често липсват под cron. Ако команда работи ръчно, но се проваля по график, това почти винаги е причината – задайте променливите, от които се нуждаете, вътре в командата или в wrapper скрипт.

Забележете, че всяко от тези е невидимо, докато задачата не се изпълни. Това е точно защо ръчното ѝ стартиране и четенето на изхода е навикът с най-висока стойност в управлението на крон.

Как да тествате крон задача преди насроченото време, Защо крон задачите могат да се провалят първия път

Петте полета на шаблона за график на крон – отляво надясно, последвани от командата. Примерът 0 3 * * * се изпълнява в 3:00 сутринта всеки ден.

Забележка: Ръчното стартиране може да докаже, че командата се изпълнява при поискване под потребителя на акаунта; то не доказва бъдещи външни зависимости, доставимост на имейли, логика за повторни опити или всяко условие по време на графика.

Как NS1 премахва догадките от крон

Крон е функция, която повечето хостинг панели третират като отметка: получавате поле, в което да напишете график, и след това сте сами. Ние възприехме противоположния подход – че насрочена задача, която не можете да тествате, е насрочена задача, на която не можете да се доверите.

Затова възможността за тестване „Run Manually“ е вградена в Мениджъра на крон задачи на SPanel във всеки план, който включва SPanel, а не е добавена като премиум екстра. Два допълнителни дизайнерски избора го подкрепят:

Тишина по подразбиране. Стандартният Linux cron изпраща изхода на всяка задача по имейл до локална пощенска кутия на <user>@<hostname> – кутия, която повечето хора никога не отварят и която постепенно се пълни с времето. Нашата настройка по подразбиране е обратната: задачите се изпълняват тихо, а вие се включвате за имейл известия само ако ги искате. Никаква мистериозна поща, никакъв излишен спам. Когато искате предупреждения, често срещан модел е да потискате рутинния изход, така че само грешките да достигат до пощенската ви кутия:

mycommand > /dev/null

Вашите задачи се изпълняват като вас, никога като root. Всяка крон задача се изпълнява под собствения потребител на вашия акаунт, с достъп точно до файловете, до които вашият акаунт може да достигне, и нищо повече. Това е същата изолация, която прави виртуалния частен сървър сигурен още от самото начало – компрометирана задача в един акаунт не може да достигне до друг.

Всичко това работи в реален мащаб – SPanel в момента захранва голям глобален отпечатък от хоствани сайтове.

Заключението

Насрочена задача, която никога не сте наблюдавали как се изпълнява, е догадка, а не план. Стартирайте я веднъж, при поискване, прочетете какво всъщност прави и разменяте седмица тихи failures за 30-секундна проверка. Това е цялата разлика между крон, на който се надявате, че работи, и крон, за който знаете, че работи.

Разгледайте управляваните VPS планове на NS1 →

Често задавани въпроси

В: Какъв е най-малкият интервал, който мога да насроча с Cron?

О: Една минута. Най-малкият шаблон за график на крон е * * * * *, който се изпълнява всяка минута, и крон не може да отиде по-фино от това. За нещо, което трябва да се изпълнява по-често (например на 30 секунди) ще ви трябва различен подход, като дълго изпълняващ се скрипт, който заспива между изпълненията, или dedicated job queue.

В: Крон задачата ми работи, когато я стартирам ръчно, но се проваля по график – защо?

О: Това почти винаги е разлика в средата. Когато стартирате команда ръчно, вашият shell вече има зададени променливи като PATH и HOME; когато крон изпълнява същата команда, средата е минимална. Обичайната поправка е да използвате пълни пътища за всяка команда (/usr/bin/php вместо php) и да зададете всички променливи, от които командата се нуждае, директно в крон реда или в wrapper скрипт.

В: Изпълняват ли се крон задачите ми като root?

О: Не – изпълняват се като собствения потребител на вашия акаунт. Всяка задача използва същата идентичност, която имате, когато влизате през SSH, което означава, че може да докосва точно файловете, до които вашият акаунт може да достигне, и нищо извън него. Това е умишлена граница за сигурност, а не ограничение.

В: Как да заменя вградения Cron на WordPress с истински Cron?

О: Вграденият планировчик на WordPress (wp-cron) се задейства само когато някой посети сайта ви, така че сайтове с нисък трафик получават забавени насрочени публикации и закъснели задачи за поддръжка. Поправката включва две стъпки: деактивирайте wp-cron в wp-config.php, след това добавете истинска крон задача, която го извиква на фиксиран график. Това е едно от най-простите подобрения за поддържане на WordPress бърз и предсказуем, особено когато сайтът расте. 

В: Ще оцелеят ли крон задачите ми при рестарт или бекъп на сървъра?

О: Да, crontabs са част от данните на акаунта, които се възстановяват по време на disaster recovery, така че насрочените задачи могат да се върнат с акаунта след rebuild. Пропуснатите изпълнения по време на downtime не се възпроизвеждат автоматично; крон продължава от следващото насрочено изпълнение, след като услугата е налична. Когато сървърът се върне онлайн, cron daemon-ът чете вашия crontab и възобновява графика без нужда от действие от ваша страна.

Борислав Тонев

Автор

Борислав е копирайтър с набито око за детайла и увлечение по информационните технологии, което датира от детството му. През годините, той е писал за огромно разнообразие от най-различни теми, но признава, че най-вълнуващото предизвикателство за него е да разбере как работи модерният онлайн свят и да предаде знанията си на читателите.

Напишете коментар

Задължително поле*