浅谈CI脚本异常退出问题定位

 更新时间:2017年11月07日 08:56:47   作者:BookShu  
下面小编就为大家带来一篇浅谈CI脚本异常退出问题定位。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

背景

在CI脚本中,使用类似如下脚本进行项目编译的计时,但在执行过程中,有时会出现CI脚本(命名为ci.sh)未完全执行的情况:

#!/bin/bash -e

sleep_time=$1

start_time=`date "+%s"`
# do sth, this sleep would simulate project compilation
sleep $sleep_time
end_time=`date "+%s"`

process_time=`expr \( end_time - start_time \)`
echo "---- process time(sec) are: " $process_time "seconds"

# ...

这个脚本,只是模拟我们在CI中的程序,项目编译前计时,项目编译后再次计时,通过sleep休眠来模拟CI中项目编译锁消耗的时间,然后计算出消耗的时间。这个简化的脚本逻辑很简单,我们通过以下命令来调用:

# ./ci.sh
---- process time(sec) are: 2 seconds

  

这样执行好像并不会出错,那实际CI中为什么会出错呢?

分析

首先,我们发现,当出现脚本未完全执行完成时,不会打印“process time(sec) are”这一句,也就是说错误是这句之前引起的。

另外,细心的朋友还会发现,在脚本的首行,我们给bash使用了-e参数,这个参数的作用就是,一旦shell脚本中任何一行出现了错误,shell脚本就停止运行。所谓的出现错误,也就是这行语句的返回值为非零。那么,CI脚本未完全执行的原因,很可能就是因为某一行语句出现了错误,导致脚本直接退出。

通过增加打印“echo $?”来打印上一行语句的执行结果,很快定位到报错的语句在计算处理时间的这一行:

process_time=`expr \( end_time - start_time \)` 

 

这一行看起来十分普通,只是简单的用终止时间减去开始时间,然后赋值给process_time。为什么会返回非0值呢?

原来,expr命令有一个小小的trick,当expr表达式中的计算结果为0时,expr命令就会返回1,而不是通常的0。在我们实际的CI任务中,一旦某个项目编译时间非常短,在1秒钟内完成,那么起止时间系统,其差值也就为0,因此,expr就会返回非零值,而CI脚本也会因此而退出。

以上这篇浅谈CI脚本异常退出问题定位就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • linux sudo密码输入时显示星号的操作方法

    linux sudo密码输入时显示星号的操作方法

    在输入linux sudo密码的时候终端是不显示任何东西的,我们不知道我们按下的密码到底输入进去了没有,如果可以像在网站上登录账号密码的时候显示星号多好,下面小编给大家介绍下linux sudo密码输入时显示星号的操作方法
    2018-01-01
  • 用于检测进程的shell脚本代码小结

    用于检测进程的shell脚本代码小结

    本文介绍一段shell脚本,它可以检测某进程或某服务是否正在运行,然后以邮件通知。有需要的朋友参考下
    2013-11-11
  • Linux shell实现每天定时备份mysql数据库

    Linux shell实现每天定时备份mysql数据库

    这篇文章主要介绍了Linux shell实现每天定时备份mysql数据库的代码,分享给大家,希望大家能够喜欢。
    2015-03-03
  • linux下利用shell在指定的行添加内容的方法

    linux下利用shell在指定的行添加内容的方法

    今天小编就为大家分享一篇linux下利用shell在指定的行添加内容的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • Linux中文件的基本属性介绍

    Linux中文件的基本属性介绍

    这篇文章介绍了Linux中文件的基本属性,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Linux进程管理方法介绍

    Linux进程管理方法介绍

    这篇文章介绍了Linux进程管理的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 详解Shell 脚本中 “$” 符号的多种用法

    详解Shell 脚本中 “$” 符号的多种用法

    这篇文章主要介绍了详解Shell 脚本中 '$' 符号的多种用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • linux使用select实现精确定时器详解

    linux使用select实现精确定时器详解

    本文讲述如何使用select实现超级时钟。使用select函数,我们能实现微妙级别精度的定时器。同时,select函数也是我们在编写非阻塞程序时经常用到的一个函数
    2013-11-11
  • 两个备份数据库的shell脚本

    两个备份数据库的shell脚本

    这篇文章主要是分享两个备份数据库的shell脚本,需要的朋友可以参考下,功能略有不同
    2013-02-02
  • linux shell命令行参数用法详解

    linux shell命令行参数用法详解

    本文介绍了linux shell命令行参数的具体用法,用户登录到Linux系统时,可以看到一个shell提示符,标识了命令行的开始。用户可以在提示符后面输入任何命令及参数。
    2014-04-04

最新评论