如何告诉 GitLab 在远程运行 sh 脚本时不要等待子进程?

问题描述 投票:0回答:1

我使用 GitLab 管道来

a) 停止远程服务器上的 python 进程

b) 部署新版本的 python 代码

c) 触发 python 进程的重启(不要等待它完成)

最后一步有问题c).

a) 的工作没有问题并立即完成。因此,在 GitLab 管道中使用

ssh
远程执行 *.sh 脚本似乎没有普遍问题。

c)
的工作确实启动了 python 进程,我用于它的帮助脚本似乎已经完成。 但是运行远程脚本后,GitLab作业卡住,一直等待

这是我的 gitlab-ci.yml 中用于工作 c)

ssh 命令

ssh -p 222 [email protected] ./path/to/start_server.sh

远程脚本的内容

start_server.sh

#!/bin/bash
#set -xv

cd my_directory
# Installs python dependencies
# The grep part removes "already satisfied" messages from the pip3 install output
pip3 install -r requirements.txt  | grep -v 'already satisfied'
cd src
(
tmux -c "python3 main.py > /dev/null" # starts server in background task to keep it open after script finished
) &

在 GitLab 作业输出的末尾,我看到三个点

...
表示作业继续运行:

=> 我怎样才能正确地告诉 GitLab 和/或 ssh

  • 不等待子进程

  • 不等待子进程的控制台输出

我尝试了几种没有帮助的方法:

a) 在行尾添加

&
:

ssh -p 222 [email protected] ./path/to/start_server.sh &

b) 使用

nohup
命令:

nohup ssh -p 222 [email protected] ./path/to/start_server.sh

ssh -p 222 [email protected] nohup ./path/to/start_server.sh

或在

start_server.sh

nohup python3 main.py &

c)包括额外的

bash
命令:

ssh -p 222 [email protected] bash ./path/to/start_server.sh

d)使用

-t
选项:

ssh -p 222 -t [email protected] ./path/to/start_server.sh

e) 将 gitlab-runner 更新到当前版本 15.9.1

f) 启用 Gitlab 调试跟踪

job_back_start:
  variables:
    CI_DEBUG_TRACE: "true"

相关:

https://forum.gitlab.com/t/gitlab-com-runner-never-finishes-after-script-is-completed/63817

https://gitlab.com/gitlab-org/gitlab-runner/-/issues/4025

https://gitlab.com/gitlab-org/gitlab-runner/-/issues/1979

https://gitlab.com/gitlab-org/gitlab-runner/-/issues/1962

https://serverfault.com/questions/962452/how-to-use-nohup-properly-within-an-ssh-session-invoked-by-gitlab-runner

编辑

如果我包含详细选项

-v
,工作有时会完成。然而,它仍然需要 > 1 分钟,主要是在脚本已经执行之后等待:

ssh -p 222 -v [email protected] ./path/to/start_server.sh

...

我想避免的等待步骤发生在输出的第 107 行和 108 行之间,在我已经得到返回值之后

ssh gitlab subprocess pipeline
1个回答
2
投票

a) 我使用

at
命令让它工作:

ssh -p 222 [email protected] "at now < ./path/to/start_server.sh"

另见相关问题

https://serverfault.com/questions/962452/how-to-use-nohup-properly-within-an-ssh-session-invoked-by-gitlab-runner

b) 同样有用的是等待几秒钟并终止 ssh 进程:

 - ssh -p 222 [email protected] ./path/to/start_server.sh &
 - sleep 5
 - pkill ssh

c)start_server.sh脚本的内容可以简化为

#!/bin/bash
#set -xv

cd my_directory
# Installs python dependencies
# The grep part removes "already satisfied" messages from the pip3 install output
pip3 install -r requirements.txt  | grep -v 'already satisfied'
cd src
python3 main.py
© www.soinside.com 2019 - 2024. All rights reserved.