Як додати запис до мого crontab?


13

Я вперше використовую кронтаб. Хочете написати декілька дуже простих тестових завдань на хрон і виконати їх.

$crontab * * * * * echo "Hi"

нічого не виробляє.

crontab */1 * * * * echo "hi"

каже */1: No such file or directory.

Крім того, як я перелічую поточні виконуючі завдання cron (не тільки ті, якими я володію, але й ті, які розпочалися іншими користувачами, такими як root).

І як я можу видалити певну задачу cron?


Щоб дізнатися, як редагувати та створювати завдання cron та пояснення щодо структури файлів, дивіться цей посібник із синтаксису crontab
KJS

Відповіді:


21

Ви не можете користуватися crontabтаким. Використовуйте man crontabдля читання про правильний спосіб виклику цієї утиліти.

Ви хочете скористатися crontab -eдля редагування записів хронів поточного користувача (ви можете додавати / змінювати / видаляти рядки). Використовуйте crontab -lдля перегляду поточного списку налаштованих завдань.

Що стосується того, щоб бачити кронати інших користувачів, це неможливо без встановлення root на установках за замовчуванням. Див. Розділ Як я перерахувати всі завдання cron для всіх користувачів, щоб перелічити все (як root).

Примітка. Будьте дуже обережні, коли ви використовуєте символи з глобальною оболонкою в командному рядку ( *і ?особливо). *буде розширено до списку файлів у поточному каталозі, що може мати несподівані ефекти. Якщо ви хочете *щось передати як аргумент, цитуйте це ( '*').


тому я роблю crontab -e, і в редактор я ставлю запис * / 1 * * * * відлуння "привіт", і коли я зберігаю цей файл, я бачу повідомлення, що crontab: установка нового crontab. але я не бачу привітання, що з’являються на екрані. Що мені зараз бракує? Спасибі.
xyz

2
Вихід crontab ніколи не перейде на ваш "екран". З підручної сторінки POSIX для crontab: "Якщо стандартний вихід і стандартна помилка не будуть перенаправлені командами, виконаними з запису crontab, будь-який згенерований вихід або помилки будуть відправлені користувачеві через метод, що залежить від реалізації, користувачеві."
Мат

1
Результат роботи буде надісланий до місцевої поштової скриньки власника завдання. (Запуск mailз командного рядка повинні отримати доступ до локального поштової скриньки, якщо він налаштований.) Для того, щоб побачити «привіт» в графічному середовищі, можна встановити завдання: * * * * * export DISPLAY=:0; xmessage 'hi'.
манатура

@manatwork Також вам може знадобитися XAUTHORITY, що може бути непростим .
дероберт

7

Є два способи редагування одного crontab:

  1. інтерактивно, використовуючи crontab -e, що відкриє crontabв редакторі вказаний $VISUALабо $EDITOR, або

  2. неінтерактивно, використовуючи crontab crontab.txt, що просто імпортує crontabзаписи з файлу crontab.txt, замінюючи існуючі активні кронтибуди для поточного користувача.

Ваша проблема полягає в тому, що ви просто crontabнеправильно використовуєте команду.


Наступне стосується неінтерактивної маніпуляції з кронатом:

Отже, щоб видалити певні завдання програмно, ви могли б зробити щось на кшталт

$ crontab -l | grep -v 'PATTERN' >crontab.txt && crontab crontab.txt

де PATTERNрегулярний вираз, який відповідатиме завданням, які ви хочете видалити. Ось, crontab -lдамо вам свій струм crontab.

Або якщо у вас є записи у файлі під назвою, crontab-fragment.txtякий ви хочете видалити з активного кронтабуля,

$ crontab -l | grep -v -Fx -f crontab-fragment.txt >crontab.txt && crontab crontab.txt

Це зчитує поточний crontab і фільтрує (видаляє) будь-який рядок, який також зустрічається у файлі crontab-fragment.txtу поточному каталозі (використовуючи порівняння рядків у повному рядку). Результат зберігається crontab.txtі завантажується звідти для заміни поточного кронта.

Щоб додати одне чи кілька завдань , зробіть щось на кшталт

$ crontab -l | cat - crontab-fragment.txt >crontab.txt && crontab crontab.txt

Це передбачається, що файл crontab-fragment.txtмістить записи, які ви хочете додати. Він читає поточний crontab, додає записи crontab-fragment.txtдо цього і створює crontab.txt. Потім crontab.txtфайл замінює поточний crontab.


2

Якщо ви хочете інтерактивно модифікувати crontab, запустіть команду crontab -e, не маючи іншого варіанту. Це запустить редактор на копії crontab; коли ви вийдете з редактора , відредагована копія стане новою копією кроти. Ви можете керувати тим, який редактор запускається через змінні VISUALта EDITORсередовище . Щоб перерахувати свій crontab, запустіть crontab -l.

Якщо ви хочете змінити crontab в сценарії, встановіть VISUALі EDITORшлях до скрипту або фрагмент оболонки, який змінює наданий файл на місці. Редактор ed- це можливість тут, або sed -iякщо ваша реалізація sedмає цю опцію. Якщо ви хочете беззастережно додати рядок, можете скористатися echo … >>. Обережно з цитуванням; якщо у вас виникли сумніви, напишіть сценарій і передайте ім'я сценарію як EDITOR.

script=$(mktemp)
cat <<'EOF' >"$script"
#!/bin/sh
ed -s "$1" <<'EOS'
g/^ *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *[^= ][^ =]*  *echo "hi"$/d
$a
* * * * * echo "hi"
.
w
q
EOS
EOF

2

Це трохи пізно, але для інших, хто шукає тут. Існують простіші способи, ніж маніпулювання потоками введення / виводу за допомогою VISUALта EDITOR.

Ви можете просто записати свій графік cron у файл, 1 завдання на рядок, і використовувати команду, crontab [filename]щоб ви могли виконувати catсвої завдання filenameяк частину вашого сценарію, а потім, нарешті, зателефонувати на crontab, якщо хочете.

насправді це найпоширеніше використання як man crontabпідказки, перераховуючи його першим


2

Якщо ви хочете додати записи до crontabавтоматизації або з командного рядка, ви можете зробити це (встановивши час, який ви хочете мати)

echo "* * * * * /yourpath/yourcommand 2>&1 >> /var/log/somelog.log" >> /var/spool/cron/root (or appropriate username)

Потім:

service crond reload

щоб перезавантажити кронтаби.


Це нерепортаж; не всі Unix зберігають файли crontab під /var/spool/cron. Кращим способом було б через crontab(1)команду.
триг

Це може бути правдою, але це було показати принцип того, як ви можете це зробити в системі, і так, crontab виконує трюк, якщо ви хочете додати рядок за рядком. Це не мало бути абсолютною відповіддю, але одна, якщо ви знаєте, де ваші речі, і вам потрібно масово додавати. Візьміть це за те, що воно є.
Кріс Спрусфілд

1

Спробуйте це за допомогою цієї команди:

crontab -e 

потім додайте роботу cron:

*/1 * * * * echo "hi"

у цьому файлі.


0

Я хотів би виділити спосіб, який я описую нижче, навіть якщо це було зазначено раніше в іншому коментарі. Я вважаю це надзвичайно корисним під час додавання записів у файл, а потім додавання файлу в crontab. Цей файл містив би дві записи нижче, і ім'я файлу було б hello-world-crontab.txt.

  • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • 0 09 * * * python /home/user/greeting.py

Потім я виконав команду нижче, щоб додати ці записи до crontab.

  • $ crontab hello-world-crontab.txt

Наступним кроком є ​​перевірка цих записів.

  • $ crontab -l

Коротке пояснення того, що робить кожен запис:

  • У цій статті напис написано "Привіт, світ!" до файлу /home/user/greeting.txtщодня о 9 ранку.
    • 0 09 * * * echo "Hello world!" >> /home/user/greeting.txt
  • Цей crontab виконує файл python, який друкує в командному рядку "Hello world!" щодня о 9 ранку.
    • 0 09 * * * python /home/user/greeting.py
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.