我有一个 gitlab 作业,如果我向它添加这个 while 循环,它就会一直失败:
- 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 命令而不是等待,因为等待命令仅在进程是您发起的而不是其他人启动的情况下才有效。 此外,我没有使用睡眠作为我跟踪从运行到运行的变化的过程的时间。
答案 0 :(得分:1)
当 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 文档。