Вопрос

Вот фрагмент 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)"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top