shell - Gitlab 作业因 while 循环而失败
问题描述
如果我向其中添加此 while 循环,我有一个 gitlab 工作会一直失败:
- while [ ! $PID ] ;do sleep 60;PID=$(ps -ef | grep Runner |grep java | awk '{print $3}'| tail -n1);echo "waiting for $PID"; done
我确定这是问题所在,因为没有这条特定的线路,我设法成功地运行了工作。
这是 gitlab_ci.yaml:
stages:
- deploy
- test
deploy:
stage: deploy
when: always
script:
-irrelevant code that always works
test:
stage: test
when: always
needs: [deploy]
script:
- while [ ! $PID ] ;do sleep 60;PID=$(ps -ef | grep Runner |grep java);echo "waiting for $PID to Finish before testing"; done
- command that starts the testing and also always works
- PID=0
- while [ ! $PID ] ;do sleep 60;PID=$(ps -ef | grep Runner |grep java);echo "waiting for $PID"; done
- echo "Finish"
artifacts:
when: always
paths:
- src/
该作业可以成功运行第一个 while 循环。第二个循环的问题是,当它完成整个 gitlab 作业失败并且它不运行 echo "finish" 命令时。
我正在使用 while 命令而不是等待,因为 wait 命令仅在进程是您启动的过程而不是像这种情况下的其他人时才有效。此外,我没有使用睡眠作为我跟踪从运行到运行的变化的过程时间。
解决方案
当 pid 为空时,[ ! -f $PID ]
然后$PID
扩展为空,在这种情况下如下:
[ ! -f ]
被执行。来自man test
:
-n STRING
the length of STRING is nonzero
STRING equivalent to -n STRING
因为-f
字符串的长度是非零的,!
是否定的,[
命令返回失败。
因为扩展结果的文件$PID
不存在,所以第二个循环是无限循环。
记得用 shellcheck.net 检查你的脚本。了解在 shell 中引用以及何时使用它并始终使用它。引用变量扩展 - "$PID"
。
而且,无论如何,如果您想等待 PID,请不要检查具有 PID 名称的文件名是否存在。相反,等待脚本管道的退出状态为零:
- while ! ps -ef | grep Runner | grep -q java; do
sleep 60;
echo "somthing";
done
如果可用,请pgrep
改用。用换行符分割长行 - 请参阅 gitlab-ci 文档。
推荐阅读
- phpstorm - PhpStorm:撤消由全局替换替换的更改
- javascript - ChartJS Y 轴刻度值错误
- angular - 在同一组件中解析 Angular 路由的更好方法
- flutter - 我怎样才能实现这个TextField?
- java - JAVA,根据添加的月份输入正确的日期
- django - 呈现表单时忽略 Django 选择字段初始值
- ios - xcode - 将登录屏幕输入链接到网站输入
- ruby-on-rails - application.js 中定义的函数不起作用
- javascript - 从按钮调用函数时未捕获的 TypeError
- localhost - 本地主机在浏览器中打开特定文件而不是 www 目录