Crontab удален?

11

Вместо того, чтобы вводить «crontab -e», я случайно набрал «crontab» и застрял в середине процесса, поэтому я прервал процесс. Теперь, когда я захожу в crontab -e, он полностью пуст. Это совсем не хорошо. Если я не могу вернуть его, мне нужно будет переписать его.

Есть ли способ:

  1. вернуть мои рабочие места в crontab? они где-то в памяти? Где находятся специфичные для учетной записи файлы crontab в linux? ИЛИ ЖЕ
  2. получите журнал всех вещей, которые сделал cron, чтобы я мог перепроектировать свой файл crontab. Я давно не смотрел на это?
user12832
источник
3
Просто восстановите его из самой последней резервной копии системы.
Дэвид Хеффернан
Если вы ввели crontab -r, как я, и нашли этот поток, вы можете восстановить команду, читающую журналы, из / var / log. В моем случае syslog.1 имел все, что мне было нужно
StackUnder

Ответы:

14

crontabбез аргументов читает файл crontab из стандартного ввода. Например, вы можете использовать:

 echo "* * * * *  run-this-every-minute" | crontab

После того, как вы забили свой crontab (то есть crontab -lничего не показывает), нет хорошего способа вернуть его.

В моей системе (Ubuntu 11.04) хранятся личные crontabs /var/spool/cron/crontabs/<USER>- но это то, что вы забили, так что это не принесет вам пользы. (Путь может быть другим в вашей системе.)

Я вижу записи /var/log/syslogдля команд, выполняемых cron; вы могли бы восстановить свой crontab из этого (или эквивалент вашей системы, если таковой имеется), но это будет утомительно.

Вот что я делаю, чтобы избежать такой проблемы:

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

crontab filename

Я никогда не использую crontab -e. Если я случайно закрою свой crontab, я могу просто перезагрузить его из файла. (Ну, почти никогда; я иногда использую crontab -eдля внесения временных изменений, зная, что смогу восстановить текущую версию позже.)

Кит Томпсон
источник
@mountainclimber: я не согласен. Чтобы сохранить ваш crontab, используйте crontab -l > filename. Чтобы восстановить его crontab filename. Используйте предоставляемый системой интерфейс; не ходите за его спиной и не манипулируйте системными файлами. Во-первых, обновление файла не обязательно скажет системе перечитать его; crontabкоманда будет. С другой стороны, могут быть различия между тем, что находится в файле, и выводом crontab -l; в Ubuntu в файле есть несколько дополнительных строк комментариев, рекомендующих вам не редактировать его.
Кит Томпсон
Я удалю свой другой комментарий. Новый комментарий: Кит упоминает путь /var/spool/cron/crontabs/<USER>. На SUSE, мой путь немного отличается (примечание дополнительный слэш) /var/spool/cron/cron/tabs/<USER>. Думаю, я бы упомянул это для новичков в cron и linux, как я. Ответ Кита правильный.
альпинист
5

Скрипт для полного восстановления crontab

Я сделал PHP-скрипт, который полностью восстанавливает ваш crontab, основываясь на журнале.

Он выводит один экземпляр каждой команды cron, запущенной пользователем за последнюю неделю.

Я положил это здесь

https://github.com/dangreenisrael/recover_crontab

Вот пример вывода:

perl ~/sorttv/sorttv.pl

/usr/local/bin/flexget

bash ~/scripts/sort_sports.sh

~/scripts/play_recently_added.sh
Дэн Грин-Лейпцигер
источник
1

Извините, но я не могу не спросить очевидное: почему бы не восстановить его из резервной копии?

Э-э, извините, я вижу, что было предложено уже.

Lee-Man
источник
0

Если переменная окружения EDITOR имеет значение EDITOR = vi, попробуйте

vi -r

восстановить сессию. Не записывайте напрямую сохраненный сеанс, если он у вас есть, в каталог crontab. Используйте это как руководство, чтобы воссоздать ваш crontab, используя

crontab -e

Примечание. Поскольку вы не указали ОС, Solaris и другие ОС UNIX не распознают изменения в файлах crontab, за исключением изменений, созданных с помощью crontab -e. Если я правильно помню, Linux делает.

Джим Макнамара
источник
Нет сеанса для восстановления; ОП набрано, crontabа не crontab -e. Смотрите мой ответ для лучшего (ИМХО) способа сохранить ваш crontab.
Кит Томпсон
0

Отличный ответ от @Keith Thompson - хорошая идея восстановления из / var / log / syslog!

Я также случайно забил свой пользовательский crontab, но смог восстановить его с помощью следующего скрипта-фу

mkdir ~/syslog
sudo cp /var/log/syslog* ~/syslog/
sudo chmod 777 ~/syslog/*
cat ~/syslog/* | grep "(username)" | grep -o "CMD.*" | sort | uniq

где имя пользователя должно быть заменено пользователем, чей crontab вы хотите восстановить.

Обратите внимание, что вам может понадобиться сначала распаковать содержимое ваших файлов /var/log/syslog.x.gz, если журналы были сжаты (Ubuntu архивирует syslog.2 +)

Это также получит только те команды, которые все еще находятся в журналах, что будет примерно за последние 7 дней ... так что если у вас есть ежемесячное задание, которое не выполнялось ... то, вероятно, оно пропало

Джейми Кук
источник