Как мне добавить запись в мой crontab?

13

Я использую crontab в первый раз. Хочу написать несколько очень простых тестовых задач cron и запустить их.

$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для редактирования записей cron текущего пользователя (вы можете добавлять / изменять / удалять строки). Используйте crontab -lдля просмотра текущего списка настроенных задач.

Что касается просмотра crontabs других пользователей, это невозможно без установки root по умолчанию. Посмотрите, как мне перечислить все задания cron для всех пользователей, чтобы узнать о некоторых способах перечисления всего (как root).

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

Мат
источник
поэтому я делаю crontab -e и в редакторе помещаю запись * / 1 * * * * echo "hi", и когда я сохраняю этот файл, я вижу сообщение, что crontab: установка нового crontab. но я не вижу приветственные сообщения, появляющиеся на экране. Чего мне не хватает сейчас? Благодарю.
xyz
2
Вывод crontab никогда не пойдет на ваш «экран». Из справочной страницы POSIX для crontab: «Если стандартный вывод и стандартная ошибка не перенаправляются командами, выполняемыми из записи crontab, любой сгенерированный вывод или ошибки будут отправлены пользователю с помощью метода, зависящего от реализации».
Мат
1
Вывод задания будет отправлен на локальный почтовый ящик владельца задания. (Запуск mailиз командной строки должны получить доступ к локальному почтовому ящику, если он настроено.) Для того, чтобы увидеть «привет» в графической среде, можно установить задачу: * * * * * export DISPLAY=:0; xmessage 'hi'.
manatwork
@manatwork Вам также может понадобиться XAUTHORITY, что может быть нелегко .
Дероберт
7

Есть два способа редактирования crontab:

  1. в интерактивном режиме, используя crontab -e, что откроет crontabв редакторе, указанном $VISUALили $EDITOR, или

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

Проблема в том, что вы просто crontabнеправильно используете команду.


Следующее касается неинтерактивных манипуляций crontab:

Таким образом, чтобы удалить определенные задачи программно, вы можете сделать что-то вроде

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

где PATTERN- это регулярное выражение, которое будет соответствовать задаче, которую вы хотите удалить. Здесь, crontab -lдаст вам ваш текущий crontab.

Или, если у вас есть записи в файле, crontab-fragment.txtкоторый вы хотите удалить из активного crontab,

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

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

Чтобы добавить одно или несколько заданий , сделайте что-то вроде

$ 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; Когда вы выходите из редактора , отредактированная копия становится новым 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

перезагрузить crontabs.

Крис Спрусфилд
источник
Это непереносимо; Не все Unix хранят файлы crontab /var/spool/cron. Лучший способ был бы через crontab(1)команду.
thrig
Это может быть правдой, но это должно было показать принцип того, как вы можете сделать это в системе, и да, crontab добьется цели, если вы хотите добавлять построчно. Это был не абсолютный ответ, а один, если вы знаете, где находится ваш материал, и вам нужно добавить массу. Возьми это за то, что есть.
Крис Спрусфилд,
1

Попробуйте это с этой командой:

crontab -e 

затем добавьте свою работу cron:

*/1 * * * * echo "hi"

в этом файле.

user158204
источник
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

Краткое объяснение того, что делает каждая запись:

  • Эта запись в crontab пишет "Привет, мир!" в файл /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
SylvesterAbreuLoreto
источник