Команда Crontab не регистрирует главный результат команды в выходной файл

Я использую Ubuntu 16.04, и я создал sh файл.

cd /home/malus
echo "______________________________________________________________________" >> /home/malus/top.txt 
date >> /home/malus/top.txt 
sudo top n 1 o %MEM u mysql | grep mysql >> /home/malus/top.txt

Я хочу сохранить информацию MySQL в файл (top.txt) + дата + разделитель

Когда я выполняю sh файл, все корректно, и выходной файл содержит 3 строки.

Но, когда я позволяю crontab для запущения скрипта, выходной файл не содержит главный вывод, и вместо этого у меня есть пустая строка (у меня есть разделитель + дата, но не главный вывод).

Для crontab я использовал эту команду:

sudo crontab -e

И содержание:

00 * * * * /home/malus/top.sh
15 * * * * /home/malus/top.sh
30 * * * * /home/malus/top.sh
45 * * * * /home/malus/top.sh

Отредактированная часть:

Вывод, когда я выполняю файл сценария непосредственно (./top.sh), как Вы видите, существует некоторые причудливые символы (в Notpad ++, они как ESC),

______________________________________________________________________
Wed Apr 10 11:24:33 EDT 2019
(B[m  636 mysql     20   0 3681720 1.233g   4236 S   0.0 63.3 113:35.71 mysqld                                                                           (B[m[39;49m[K

Вывод crontab, как Вы видите, нет никакого вывода для главной команды:

______________________________________________________________________
Wed Apr 10 11:30:01 EDT 2019

ОТВЕТ

Я сделал их изменяющиеся согласно steeldriver и terdon (Благодаря Вам обоим)

Файл сценария:

echo "______________________________________________________________________" >> /home/malus/top.txt 
date >> /home/malus/top.txt 
sudo top n 2 -b o %MEM u mysql | grep mysql >> /home/malus/top.txt

Для выполнения crontab как корень:

sudo crontab -e

crontab содержание:

00 * * * * /home/malus/top.sh 2>>/home/malus/top.err
15 * * * * /home/malus/top.sh 2>>/home/malus/top.err
30 * * * * /home/malus/top.sh 2>>/home/malus/top.err
45 * * * * /home/malus/top.sh 2>>/home/malus/top.err
2
задан 10 April 2019 в 21:33

1 ответ

Вы добавили это к crontab корня (Вы работали sudo crontab -e), итак, почему Вы работаете top с sudo? Все в этом crontab будет выполнено как корень. Что еще более важно, Вы никогда не должны выполнять команду с sudo если та команда не должна быть выполнена как корень. top управляйте никогда не должен базироваться доступ, каждый пользователь видит тот же вывод, таким образом, sudo там бессмысленно. cd также бессмысленно, нет никакой потребности переместиться в /home/malus каталог. Так измените свой сценарий на:

echo "______________________________________________________________________" >> /home/malus/top.txt 
date >> /home/malus/top.txt 
top n 1 o %MEM u mysql | grep mysql >> /home/malus/top.txt

Тем не менее я не вижу никакой другой проблемы в Вашем файле. top команда находится в /usr/bin и /usr/bin находится в ПУТИ крона, таким образом, Вам не нужен полный путь для него. То, что происходит, вероятно, что команда не имеет никакого вывода.

Например, если я выполняю Ваш top в системе, где mysql пользователь выполняет что-то, я добираюсь:

$ top n 1 o %MEM u mysql | grep mysql
 2379 mysql     20   0 28.915g 5.612g  13516 S   0.0  4.3   2038:41 mysqld         

Однако, если mysql пользователь ничего не выполняет, нет никакого вывода начиная с grep mysql не будет соответствовать:

$ top n 1 o %MEM u mysql | grep mysql 
$ 

Так, если date правильно добавляется к /home/malus/top.txt, затем отсутствие вывода от top просто средства mysql пользователь ничего не выполнял, когда crontab был выполнен.

Единственное другое объяснение состоит в том, что у Вас есть Ваш top и/или grep команды в нестандартном месте. Если так, выполненный type top и type grep для наблюдения, где они:

$ which top grep
/usr/bin/top
/bin/grep

И затем используйте те пути:

echo "______________________________________________________________________" >> /home/malus/top.txt 
date >> /home/malus/top.txt 
/usr/bin/top n 1 o %MEM u mysql | /bin/grep mysql >> /home/malus/top.txt

Но это действительно маловероятно, если Вы не переместили их, и они не находятся в /usr/bin или /bin.

Наконец, для отладки его далее измените crontab так, чтобы это также сохранило вывод ошибок:

00 * * * * /home/malus/top.sh 2>>/home/malus/top.err
15 * * * * /home/malus/top.sh 2>>/home/malus/top.err
30 * * * * /home/malus/top.sh 2>>/home/malus/top.err
45 * * * * /home/malus/top.sh 2>>/home/malus/top.err

Затем посмотрите, записано ли что-нибудь в /home/malus/top.err.


Ошибка Вы имели, TERM environment variable not set. то, потому что переменная среды $TERM не установлен на сессии оболочки крона, и top потребность, что, чтобы знать, какой произведенный производить:

$ unset TERM
$ top
TERM environment variable not set.

Простое обходное решение, поэтому, должно установить его в Вашем сценарии:

echo "______________________________________________________________________" >> /home/malus/top.txt 
date >> /home/malus/top.txt 
TERM=xterm top n 1 o %MEM u mysql | grep mysql >> /home/malus/top.txt
3
ответ дан 2 December 2019 в 02:40

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

Похожие вопросы: