我有一个shell脚本,通过crontasks向我发送错误信息,如下所示:
exec >&-;
output="$(cat)";
shopt -s nocasematch
if [[ "$output" == *"error"* || "$output" == *"warning"* ]]; then
echo "$output" | mail -s "Error" my@email.com;
fi
exit 0;
我的crontab看起来像:
*/1 * * * * /opt/sh/email.sh /usr/bin/php /home/sites/website/app/console my:cli:command >> /var/log/cron.d/ my.cli.command/log 2>&1
脚本有效,但" cat"似乎挂了:
root 23083 0.0 0.0 139752 1112 ? S Mar20 0:00 \_ CROND
500 23091 0.0 0.0 106096 1016 ? Ss Mar20 0:00 | \_ /bin/sh -c /usr/bin/php /var/www/website/app/console my:cli:command 2>&1 | /usr/local/bin/email.sh
500 23096 0.0 0.3 463528 27292 ? S Mar20 0:35 | \_ /usr/bin/php /var/www/website/app/console my:cli:command
500 23097 0.0 0.0 106096 1048 ? S Mar20 0:00 | \_ /bin/bash /usr/local/bin/email.sh
500 23101 0.0 0.0 100936 496 ? S Mar20 0:00 | \_ cat
root 12167 0.0 0.0 139752 1276 ? S Mar22 0:00 \_ CROND
500 12183 0.0 0.0 106096 1104 ? Ss Mar22 0:00 | \_ /bin/sh -c /usr/bin/php /var/www/website/app/console my:cli:command 2>&1 | /usr/local/bin/email.sh
500 12185 0.0 0.4 463528 36612 ? S Mar22 0:32 | \_ /usr/bin/php /var/www/website/app/console my:cli:command
500 12186 0.0 0.0 106096 1104 ? S Mar22 0:00 | \_ /bin/bash /usr/local/bin/email.sh
500 12194 0.0 0.0 100936 516 ? S Mar22 0:00 | \_ cat
root 1675 0.0 0.0 139752 1128 ? S Mar25 0:00 \_ CROND
有任何想法吗?
答案 0 :(得分:3)
因为你没有给cat
连接任何输入而挂起,所以它只会永远听STDIN。
从手册页:
cat实用程序按顺序读取文件,将它们写入标准输出。文件操作数以命令行顺序处理。如果file是单个破折号(` - ')或缺席,则cat从标准输入读取。如果file是UNIX域套接字,则cat连接到它,然后将其读取直到EOF。这补充了inetd(8)中提供的UNIX域绑定功能。