Я использую 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
Вы добавили это к 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