У меня вопрос к поведению 2>&1
. Насколько я понимаю, 2>&1
относится к перенаправлению ошибки на стандартный вывод, который должен находиться в том же файле журнала.
Я создаю файл журнала с отметкой времени. Однако, если я планирую это через вкладку cron, я получаю 2 файла журнала, и один из них имеет размер файла 0. Если я запускаю его из командной строки, создается только один файл журнала.
Строка сценария, о которой идет речь:
mysql --defaults-extra-file=/home/ec2-user/performance/.monitor.cnf <<EOD >>$log 2>&1
Вывод, если он из cron - каждый раз, когда есть пара файлов журнала, отметка времени в имени файла немного отличается, и один из двух файлов журнала имеет размер 0
-rw-r--r-- 1 ec2-user ec2-user 0 Jan 18 20:00 300_sec_status-2020-01-18_20:00:00_1579338000_013623289-mysql_innodb_status.log
-rw-r--r-- 1 ec2-user ec2-user 4.4k Jan 18 20:00 300_sec_status-2020-01-18_20:00:02_1579338002_253837419-mysql_innodb_status.log
Вывод, если он выполняется вручную - генерируется только один файл
-rw-rw-r-- 1 ec2-user ec2-user 4.4K Jan 18 20:08 300_sec_status-2020-01-18_20:08:40_1579338520_601067011-mysql_innodb_status.log
cron tab setup:
*/5 * * * * /home/ec2-user/performance/monitor.sh
Полный текст моего монитора. sh следует
Обратите внимание, что все команды mysql генерируют два файла журнала. Я просто взял один из них, чтобы показать пример.
#!/bin/bash
cd ~ec2-user/performance
INTERVAL=300
PREFIX=${INTERVAL}_sec_status
RUNFILE=RUN
if [ ! -e mysql_variables.log ]; then
mysql --defaults-extra-file=/home/ec2-user/performance/.monitor.cnf <<EOD >>mysql_variables.log 2>&1
SHOW GLOBAL VARIABLES \G
EOD
fi
if [ ! -e system_info_cpu.log ]; then
lscpu > system_info_cpu.log
fi
if [ ! -e system_info_memory.log ]; then
cat /proc/meminfo | grep MemTotal >system_info_memory.log
fi
if [ -e $RUNFILE ]; then
file=${PREFIX}
#sleep=$(date +%s.%N | awk "{print $INTERVAL - (\$1 % $INTERVAL)}")
#sleep $sleep
ts="$(date +'%F_%T_%s_%N')"
loadavg="$(uptime)"
log=${file}-${ts}-uptime.log
echo "$ts $loadavg" >> $log
log=${file}-${ts}-mysql_global_status.log
mysql --defaults-extra-file=/home/ec2-user/performance/.monitor.cnf <<EOD >>$log 2>&1
SHOW GLOBAL STATUS\G
EOD
log=${file}-${ts}-mysql_full_processlist.log
mysql --defaults-extra-file=/home/ec2-user/performance/.monitor.cnf <<EOD >>$log 2>&1
SHOW FULL PROCESSLIST\G
EOD
log=${file}-${ts}-mysql_innodb_status.log
mysql --defaults-extra-file=/home/ec2-user/performance/.monitor.cnf <<EOD >>$log 2>&1
SHOW ENGINE INNODB STATUS\G
EOD
log=${file}-${ts}-iostat.log
iostat -c -d -k >>$log
log=${file}-${ts}-vmstat.log
vmstat -s >>$log
vmstat -f >> $log
log=${file}-${ts}-ps.log
ps -o pid,user,%mem,command ax | sort -b -k3 -r | head -5 >>$log
fi