От ошибки к переменной (с Crontab) - PullRequest
2 голосов
/ 11 ноября 2009

Вот фрагмент сценария 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 может быть исполнен хрон. Я проверил, добавив фиктивную задачу для запуска каждую минуту: /usr/bin/mpstat -P ALL >> somefile и проверил вывод. Это работает.

  • egrep, tr и cut все отлично работает под cron.

  • Я думаю, что это действительно связано с соглашением о присвоении eval ... но я не знаю, почему это будет проблемой, учитывая, что это относительно фундаментальная конструкция ... После попытки Предложение Адама, я теперь понятия не имею, что думать ...

Редактировать: убрать eval использование ... все еще нет кости.

Ответы [ 3 ]

1 голос
/ 11 ноября 2009

Ваша проблема исходит от mpstat. Когда он запускается из командной строки, он выводит время с AM / PM. Это не когда он управляется cron. Как предположил ennuikiller , это, вероятно, проблема окружающей среды. В моей системе echo $LANG выдает «en_US.UTF-8» в командной строке, но ничего при запуске в cron. Эта или какая-то другая переменная окружения влияет на то, как mpstat выводит время, поэтому, когда вы grep для "(AM | PM)", оно не находит его.

Кстати, почему бы тебе просто не сделать:

ldsys=$(/usr/bin/mpstat ... )

без присвоения "cmd1", eval, echo и трубопроводам sh?

0 голосов
/ 11 ноября 2009

Вы пытались устранить eval?

Вместо

ldsys=`eval $cmd1`

Попробуйте

ldsys=`echo "$cmd1" | /bin/sh`

или

ldsys="$(echo $cmd1 | /bin/sh)"
0 голосов
/ 11 ноября 2009

Вы столкнулись с одной из следующих проблем:

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 

Обычно выходные данные любой программы отправляются на STDOUT (стандартный выход) и обычно отображаются на чьем-то экране. Для заданий, запускаемых cron, STDOUT будет направляться в локальную почтовую подсистему, что означает, что любой вывод, сгенерированный заданием cron, будет отправлен пользователю, владеющему заданием

...