Команда bash + отлично работает в оболочке Linux, но не из задания cron

Я пытаюсь отключить своп на наших машинах с 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, вероятно, использует sh, а не bash, для выполнения своих команд. [[ не sh.

Shawn 22.06.2023 08:06

(Я бы переместил все это в отдельный скрипт и запускал его из cron вместо того, чтобы пытаться встроить его)

Shawn 22.06.2023 08:07

Я предпочел не создавать отдельный скрипт

Judy 22.06.2023 08:07

также я изменил "[[" на "[" но не помогает

Judy 22.06.2023 08:12

Я также рекомендую научиться использовать $() вместо архаичных обратных кавычек. Их легче читать, и они правильно вложены.

Barmar 22.06.2023 08:16

Если вам просто нужно количество строк, используйте wc -l вместо конвейера в awk.

Barmar 22.06.2023 08:17

Используйте pgrep вместо ps | grep something | grep -v grep

Barmar 22.06.2023 08:18

Я также проверяю эту строку --> * * * * * 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 , но все равно не помогает

Judy 22.06.2023 08:22

также этот не работает, уже проверьте его в cron --> * * * * * root [ $( swapon -s | wc -l) -ne 0 ] && [ $( ps -ef | grep "swapoff -a" | grep -v grep | wc -l) -eq 0 ]

Judy 22.06.2023 08:26

Не размещайте код в комментариях. Если у вас есть дополнительные сведения, отредактируйте их в вопросе. Тогда вы сможете отформатировать их более читабельно. Но эти длинные остроты трудно читать, даже если вы отформатируете их. Почему вы не хотите использовать сценарий?

Barmar 22.06.2023 08:32

извините, я извиняюсь за это

Judy 22.06.2023 08:37

&& в ( swapoff -a & ) && ... для меня не имеет смысла. Какой код выхода вы тестируете? Поскольку swapoff запускается в фоновом режиме, вы едва проверяете, сработал ли запуск swapoff в фоновом режиме.

user1934428 22.06.2023 14:30

Кроме того, почему это помечено bash? По крайней мере, из той части кода, которую вы опубликовали, я не вижу никакого bash.

user1934428 22.06.2023 14:31

Наконец, я бы не помещал такие сложные команды буквально в crontab, а в скрипт оболочки, и запускал бы только скрипт из crontab. Это дает вам гораздо лучший контроль над отладкой.

user1934428 22.06.2023 14:32
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
14
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Убедитесь, что вы объявили свои 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

Другие вопросы по теме