Я пытаюсь отключить своп на наших машинах с Linux с помощью задания cron.
сначала я хочу объяснить правильный подход к отключению подкачки на Linux-машинах (у нас RHEL 7.x)
процесс должен быть таким
1 swapoff -a & (в этом примере мы использовали его как процесс)
2 прокомментируйте строку со свопом в /etc/fstab как:
3 #/dev/mapper/vg_lab_swap swap swap defaults 0 0
мы создаем задание cron с именем - swap_disable.cron
и cron jon выглядит так (мы устанавливаем задание cron на каждую минуту только для тестирования)
* * * * * root [[ ` swapon -s | wc | awk '{print $1}' ` -ne 0 ]] && [[ ` ps -ef | grep "swapoff -a" | grep -v grep | wc | awk '{print $1}' ` -eq 0 ]] && ( swapoff -a & ) && sed -ie '//dev/mapper/vg_lab_swap/ s/^#*/#/' /etc/fstab
поэтому, подождав более одной минуты, мы увидели, что файл /etc/fstab не обновляется и на самом деле обмен не отключен.
поэтому мы устанавливаем только следующую строку в задании cron, чтобы понять, если что-то не так с нашим синтаксисом
больше swap_disable.cron
* * * * * root [[ ` swapon -s | wc | awk '{print $1}' ` -ne 0 ]] && [[ ` ps -ef | grep "swapoff -a" | grep -v grep | wc | awk '{print $1}' ` -eq 0 ]] && echo why_line_not_works >/tmp/file.txt
объяснять:
swapon -s | wc | awk '{print $1}' - проверьте, отключен ли своп
ps -ef | grep "swapoff -a" | grep -v grep | wc | awk '{print $1}' - проверьте, запущен ли уже процесс swapoff
и, к сожалению, эта простая строка выше также не работает, и файл /tmp/file.txt не создан
так что не так в моей работе cron?
почему строчка:
[[ ` swapon -s | wc | awk '{print $1}' ` -ne 0 ]] && [[ ` ps -ef | grep "swapoff -a" | grep -v grep | wc | awk '{print $1}' ` -eq 0 ]] && echo why_line_not_works >/tmp/file.txt
работает нормально на консоли оболочки Linux, но не с задания cron?
пример, когда мы запускаем его из sh
cron.d]# sh
sh-4.2# [ ` swapon -s | wc | awk '{print $1}' ` -ne 0 ] && [ ` ps -ef | grep "swapoff -a" | grep -v grep | wc | awk '{print $1}' ` -eq 0 ] && echo why
why
(Я бы переместил все это в отдельный скрипт и запускал его из cron вместо того, чтобы пытаться встроить его)
Я предпочел не создавать отдельный скрипт
также я изменил "[[" на "[" но не помогает
Я также рекомендую научиться использовать $() вместо архаичных обратных кавычек. Их легче читать, и они правильно вложены.
Если вам просто нужно количество строк, используйте wc -l вместо конвейера в awk.
Используйте pgrep вместо ps | grep something | grep -v grep
Я также проверяю эту строку --> * * * * * root [ $( swapon -s | wc | awk '{print $1}') -ne 0 ] && [ $( ps -ef | grep "swapoff -a" | grep -v grep | wc | awk '{print $1}') -eq 0 ] && echo почему >/tmp/test.txt , но все равно не помогает
также этот не работает, уже проверьте его в cron --> * * * * * root [ $( swapon -s | wc -l) -ne 0 ] && [ $( ps -ef | grep "swapoff -a" | grep -v grep | wc -l) -eq 0 ]
Не размещайте код в комментариях. Если у вас есть дополнительные сведения, отредактируйте их в вопросе. Тогда вы сможете отформатировать их более читабельно. Но эти длинные остроты трудно читать, даже если вы отформатируете их. Почему вы не хотите использовать сценарий?
извините, я извиняюсь за это
&& в ( swapoff -a & ) && ... для меня не имеет смысла. Какой код выхода вы тестируете? Поскольку swapoff запускается в фоновом режиме, вы едва проверяете, сработал ли запуск swapoff в фоновом режиме.
Кроме того, почему это помечено bash? По крайней мере, из той части кода, которую вы опубликовали, я не вижу никакого bash.
Наконец, я бы не помещал такие сложные команды буквально в crontab, а в скрипт оболочки, и запускал бы только скрипт из crontab. Это дает вам гораздо лучший контроль над отладкой.





Убедитесь, что вы объявили свои SHELL и PATH в своем crontab, чтобы не указывать абсолютные пути для всех команд, которые вы запускаете.
Попробуйте следующее в вашем файле cron.d:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
* * * * * root [[ ` swapon -s | wc | awk '{print $1}' ` -ne 0 ]] && [[ ` ps -ef | grep "swapoff -a" | grep -v grep | wc | awk '{print $1}' ` -eq 0 ]] && echo why_line_not_works >/tmp/file.txt
cron, вероятно, использует
sh, а неbash, для выполнения своих команд.[[неsh.