Вопрос или проблема
Я просто хочу приостановить всё. Не выполняйте ничего, что указано в crontab -l
.
crontab -e
, затем закомментируйте каждую строку, которую не хотите запускать, с помощью #
.
Сначала создайте резервную копию crontab:
crontab -l > my_cron_backup.txt
Затем вы можете очистить его:
crontab -r
Чтобы восстановить:
crontab my_cron_backup.txt
crontab -l
Это работает только для crontab пользователя, который выполняет эти команды, и не очищает/восстанавливает crontab других пользователей. Мой другой ответ касается приостановки запусков от всех пользователей.
У вас есть доступ root? Просто приостановите cron
sudo /etc/init.d/crond stop
Затем перезапустите его, когда будете готовы
sudo /etc/init.d/crond start
Если вы используете vi в качестве редактора, просто введите :%s/^/#/
в командном режиме. Во всех строках (%), он заменяет (s///) начало строки (^) на хэш (#).
Я не был доволен вышеперечисленными вариантами, так как они не были однострочными.
Чтобы отключить crontab -l | perl -nle 's/^([^#])/# $1/;print' | crontab
Чтобы включить crontab -l | perl -nle 's/^#\s*([0-9*])/$1/;print' | crontab
пример использования (отредактирован, чтобы показать, что это не отключает комментарии)
$ crontab -l
# Комментарий
0 0 * * 0 /opt/something.sh
$ crontab -l|perl -nle 's/^([^#])/# $1/;print'|crontab
$ crontab -l
# Комментарий
# 0 0 * * 0 /opt/something.sh
$ crontab -l|perl -nle 's/^#\s*([0-9*])/$1/;print'|crontab
$ crontab -l
# Комментарий
0 0 * * 0 /opt/something.sh
Я протестировал это на RHEL и AIX, и оно должно работать из коробки без необходимости установки чего-либо
В моих ограниченных тестах установка shell на /bin/false работает. Вы все равно будете видеть /opt/job.sh
, выполняющееся в ваших логах, но это будет no-op:
SHELL=/bin/false
*/1 * * * * root /some/job.sh
Я получил идею от ответа, предоставленного @segaps
Чтобы отключить:
crontab -l | awk '{print "# "$0}' | crontab
Чтобы включить:
crontab -l | cut -c 3- | crontab
Единственная проблема с решением, предоставленным segaps, заключается в том, что оно раскомментирует задания, которые уже закомментированы пользователем.
На любом дистрибутиве Unix/Linux, который я знаю (кроме, возможно, OpenBSD):
mv /var/spool/cron /var/spool/cron_is_disabled
Это:
- отключает crontab всех пользователей
- но не системный /etc/crontab (/etc/cron.daily и т. д.)
- сохраняется после перезагрузки
- это однострочник, да 🙂
Вы можете использовать следующее следующим образом:
crondisable
cronenable
crondisable some_other_user
...
Код zsh
(поместите в ваш .zshrc
):
ecerr () {
print -r -- "$@" >&2
}
crondisable() {
local user="${1:-$(whoami)}"
local cronpath="/tmp/$user.cron.tmp"
test -e "$cronpath" && {
ecerr "Существует уже отключенный crontab по адресу $cronpath. Удалите его вручную, если хотите продолжить."
return 1
}
crontab -l -u $user > "$cronpath"
crontab -r -u $user
}
cronenable() {
local user="${1:-$(whoami)}"
local cronpath="/tmp/$user.cron.tmp"
test -e "$cronpath" || {
ecerr "Нет отключенного cron по адресу $cronpath"
return 1
}
crontab -u $user "$cronpath"
mv "$cronpath" "${cronpath}.bak"
}
В современном Linux, который имеет systemd:
sudo systemctl stop crond.service
Который затем можно снова включить с помощью
sudo systemctl start crond.service
Чтобы сделать это, используя nano в качестве редактора:
sudo env EDITOR=nano crontab -e
затем закомментируйте каждую строку, которую не хотите запускать, с помощью #
Ответ или решение
Для временного отключения всех заданий в crontab вы можете использовать несколько различных подходов, в зависимости от ваших нужд и прав доступа. Рассмотрим подробнее каждый из предложенных методов.
1. Комментирование строк
Самый простой способ — это комментировать каждую строку в crontab с помощью символа #
. Для этого выполните следующие шаги:
-
Создайте резервную копию текущего crontab:
crontab -l > my_cron_backup.txt
-
Откройте crontab для редактирования:
crontab -e
-
Закомментируйте каждую строку, добавив в начале строки символ
#
. Если вы используете текстовый редакторvi
, вы можете выполнить команду:%s/^/#/
, которая автоматически добавит#
в начало каждой строки::%s/^/#/
-
Сохраните и закройте редактор.
2. Полное удаление crontab
Если вы хотите временно отключить задания и не собираетесь восстанавливать их сразу, вы можете полностью удалить crontab:
crontab -r
Чтобы восстановить его позже, просто используйте файл резервной копии:
crontab my_cron_backup.txt
Этот метод удаляет задания только для текущего пользователя и не затрагивает crontab других пользователей.
3. Остановка службы cron
Если у вас есть права на выполнение команд от имени суперпользователя, вы можете остановить всю службу cron. Это более радикальный подход, но он эффективно предотвратит выполнение всех заданий cron:
-
Чтобы остановить службу:
sudo systemctl stop crond.service
-
Чтобы перезапустить службу позже:
sudo systemctl start crond.service
4. Использование команд однострочников
Если вам необходимы однострочные команды для отключения и включения заданий, вы можете воспользоваться следующими командами:
-
Для отключения всех заданий в crontab:
crontab -l | perl -pe 's/^(?!#)/#/' | crontab
-
Для включения обратно:
crontab -l | perl -pe 's/^# //' | crontab
5. Изменение shell на /bin/false
Другой менее традиционный метод заключается в изменении SHELL
на /bin/false
. Это позволит заданиям выполняться, но они не будут выполнять реальные действия:
SHELL=/bin/false
При использовании этого метода в логах всё равно будет отображаться выполнение команд, но фактически выполнение не произойдет.
Заключение
Выбор подходящего метода отключения заданий в crontab зависит от ваших целей: временное отключение, полное удаление или остановка службы. Каждый из методов имеет свои плюсы и минусы, и вам следует выбрать тот, который лучше всего соответствует вашим требованиям. Не забудьте всегда делать резервные копии перед внесением изменений, чтобы избежать потери важной информации или настройки.