Ошибка вычисления переменной (с Crontab)
Вопрос
Вот фрагмент bash-скрипта, который я пишу для регистрации загрузки процессора:
#!/bin/bash
# ... irrelevant nonsense ...
cmd1="/usr/bin/mpstat -P ALL | egrep '(AM|PM)([[:space:]]+)(0)' | tr -s ' ' | cut -d' ' -f4"
ldsys="$(echo $cmd1 | /bin/sh)"
# ... irrelevant nonsense ...
$ldsys
устанавливается правильно, когда скрипт выполняется обычным способом из консоли.Оно золотое. Вот в чем проблема: при выполнении с помощью crontab, $ldsys
пусто.
За последние три часа я перепробовал миллионы способов, чтобы заставить эту штуку работать...но я не могу найти что угодно.У кого-нибудь есть какие-нибудь идеи?
Примечания:
/usr/bin/mpstat
может выполняется с помощью cron.Я протестировал, добавив фиктивную задачу для запуска каждую минуту:/usr/bin/mpstat -P ALL >> somefile
и проверка выходных данных.Это работает.egrep
,tr
, иcut
под cron все работает нормально.Я думаю, что это действительно связано с соглашением о присвоении eval...но я не знаю, почему это может быть проблемой, учитывая, что это относительно фундаментальная конструкция...Попробовав предложение Адама, я теперь понятия не имею, что и думать...
Редактировать: вычищенный eval
использование...по-прежнему никаких шансов.
Решение
Ваша проблема исходит из mpstat
.Когда он запускается из командной строки, он выводит время с помощью AM / PM.Этого не происходит, когда им управляют cron
.Как эннуикиллер предполагается, что это, вероятно, проблема окружающей среды.В моей системе echo $LANG
выдает "en_US.UTF-8" в командной строке, но ничего не выдает при запуске в cron
.Эта или какая-либо другая переменная среды влияет на способ mpstat
выводит время, поэтому, когда вы grep
для "(AM | PM)" он его не находит.
Кстати, почему бы тебе просто не сделать:
ldsys=$(/usr/bin/mpstat ... )
без присвоения "cmd1", eval
, тот самый echo
и трубопровод для sh
?
Другие советы
Вы столкнулись с одной из двух следующих проблем:
This is perhaps our number one complaint with cron. When you login to Unix, startup scripts setup your environment. You can see your environment with the commands "printenv" or "env". On the other hand, cron sets up only a sparse environment
Обычно выходные данные любой программы отправляются в стандартный вывод (standard out) и обычно выводятся на чей-либо экран дисплея.Для заданий, запущенных cron, стандартный вывод будет направлен в локальную почтовую подсистему, что означает, что любой вывод, сгенерированный заданием cron, будет отправлен по почте пользователю, владеющему заданием
Вы пробовали устранить eval
?
Вместо того, чтобы
ldsys=`eval $cmd1`
Попробуй
ldsys=`echo "$cmd1" | /bin/sh`
или
ldsys="$(echo $cmd1 | /bin/sh)"