SHELL异常处理
SHELL异常处理
容器内运行一个php脚本,需要根据php脚本运行的结果,决定是否继续接着运行。其中包含了错误重定向,已经获取上次运行结果。整体如下:
写SHELL好久了,经常被异常困扰,可竟然坚持了若干年没用过,回想以前服务过的公司,阿弥陀佛,罪过罪过。废话少说,希望此篇文章可以协助大家和我彻底结束SHELL脚本就是LINUX命令集合的初级阶段。
一、STDOUT、STDERR
如果要获取SHELL脚本的异常输出,就需要首先理解SHELL命令的标准输出STDOUT、标准错误STDERR。
当我们在编写 shell 脚本时,我们会非常频繁地操作执行命令的标准输入stdin、标准输出stdout、标准错误stderr。当我们执行脚本文件或者执行一个 shell 命令的时候,单从终端输出我们很难区分哪些是标准输出,哪些是标准错误。所以我们把这些信息重定向特定的地方,以便于我们分析脚本文件及 shell 命令的执行情况,这就用到了文件描述符。文件描述符是与打开文件或者数据流相关联的整数,0、1、2 是系统保留的三个文件描述符,分别对应标准输入、标准输出、标准错误。Linux Shell 使用 “ > “ “>>” 进行对文件描述符进行重定位。例如代码:
#!/bin/bash
ls liqiu > /tmp/error #很明显这是一个错误的命令
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l > /tmp/log
echo $?
输出结果:
@~ $ ~/study/test.sh
ls: liqiu: No such file or directory
1
0
1 说明ls liqiu > /tmp/error执行错误,0 说明ls -l > /tmp/log执行成功。那么希望的记过是/tmp/error报错错误日志,/tmp/log保存正确的结果,可查看文件发现不是这么回事。
@~ $ more /tmp/log
total 0
drwx------ 3 liqiu staff 102 4 26 2014 Applications
drwx------+ 4 liqiu staff 136 11 2 17:06 Desktop
drwxr-xr-x 4 liqiu staff 136 10 18 09:56 svn
@~ $ more /tmp/error
@~ $
原因在于:重定位运算符 “>” 的默认参数为标准输出 stdout ,即 1 ; 所以 “>” 等价于 “1>”; 上面的代码等价于:
#!/bin/bash
ls liqiu 1> /tmp/error
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l 1> /tmp/log
echo $?
二、捕获异常
所以要捕获异常,需要修改代码:
#!/bin/bash
ls liqiu > /tmp/error 2>&1 #使用 " 2>&1" 把标准错误 stderr 重定向到标准输出 stdout ;
echo $? #捕获上一条命令的输出 (if 0 正常 else 错误)
ls -l > /tmp/log
echo $?
执行之后,发现错误信息出现在了文件/tmp/log中。
@~ $ cat /tmp/error
ls: liqiu: No such file or directory
@~ $
三、代码实现
#!/bin/bash
test()
{
return 2;
}
test
result=$?
echo "result is:"$result
echo "chenyu"
#这里不能写成if [$? != 0]或者if [$? != 0 ]或者if[ $? != 0]
if [ $? != 0 ]; then
echo "last exe fail"
exit 1
else
echo "last exe success"
fi
注意if [ $? != 0 ]; then之间有空格,缺少了,则会报错。
运行结果
result is:2
chenyu
last exe success
四、项目应用
#在php中,如果出错,提示信息,并die(1);
#在shell的内容如下:
#!/bin/sh
if [ $APOLLO_HOST ];then
/usr/local/php/bin/php /bin/apollo.php
if [ $? != 0 ]; then # apollo.php 执行失败
echo "$0脚本已停止,apollo.php获取配置失败。"
exit 1;
fi
fi

