You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

启动二进制Daemon程序导致部署流水线停滞的排查求助

问题描述

我有一个包含两台服务器的简单工作流:一台服务器克隆代码仓库、压缩后通过scp传输到另一台服务器;另一台负责解压文件、构建项目、终止当前运行的二进制程序,再启动新构建的二进制程序。

当前问题是执行到启动二进制程序步骤时,部署流水线出现停滞,注释掉启动二进制的代码后问题消失。以下是相关的关键文件内容:

关键文件内容

deploy_hft_001.yml

name: Deploy to hft_001
env:
  HOST_NAME: hft_001

on:
  workflow_dispatch:

jobs:
  deploy:
    runs-on: hft_000
    steps:
      - name: Check out repository code
        uses: actions/checkout@v3

      - name: Run deploy script
        run: |
          . deploy_common.sh
          . deploy.sh "${HOST_NAME}"

deploy.sh(片段)

...
echo "-> Removing build directory"
rm -rf ${BUILD_DIR}
echo "-> Killing the running app."
echo ${HOST_PASS} | sudo -S pkill -f ${BINARY_NAME}
echo "-> Killed the running app."
cd ${DEPLOYMENT_DIR}
echo "-> Running the freshly deployed app."
./${BINARY_NAME}
echo "-> Ran the freshly deployed app."
echo "-> Deployment successful to ${HOST_NAME} on folder: ${DEPLOYMENT_DIR}"
exit
echo "-> Bash exited"
EOT
echo "-> After EOT."

deploy_common.sh用于从克隆服务器的环境变量中导入主机用户名、IP和密码。

工作流日志片段

...
-> Creating build directory
-> Extracting repository
-> Deleting archive
-> Opening build directory
-> Building project
-- The CXX compiler identification is GNU 10.1.0
-- Check for working CXX compiler: /usr/local/bin/c++
-- Check for working CXX compiler: /usr/local/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/hft_001/github-actions/builds/af175d8ae26b19cf5e022e5b2ed19510a00656e2/build
Scanning dependencies of target config_manager
[ 12%] Building CXX object CMakeFiles/config_manager.dir/src/main.cpp.o
[ 25%] Building CXX object CMakeFiles/config_manager.dir/src/epoll_helper.cpp.o
[ 87%] Building CXX object CMakeFiles/config_manager.dir/src/file_helper.cpp.o
[ 87%] Building CXX object CMakeFiles/config_manager.dir/src/string_helper.cpp.o
[ 87%] Building CXX object CMakeFiles/config_manager.dir/src/socket_helper.cpp.o
[ 87%] Building CXX object CMakeFiles/config_manager.dir/src/instrument_manager.cpp.o
[ 87%] Building CXX object CMakeFiles/config_manager.dir/src/json_helper.cpp.o
[100%] Linking CXX executable config_manager
[100%] Built target config_manager
-> Creating deployment directory
-> Copying binaries into deployment directory
-> Writing deployment information
-> Removing build directory
-> Killing the running app.
-> Killed the running app.
-> Running the freshly deployed app.
I'm a daemon process, please check the output log:
sudo tail -f /var/log/config_manager.log
-> Ran the freshly deployed app.
-> Deployment successful to hft_001 on folder: ~/workspace/deployments/bist_mp_v2.0/config
-> After EOT.
[sudo] password for hft_001: 

流水线停滞疑似因出现sudo密码请求导致,但我仅在终止进程时使用了sudo且已通过echo传入密码(该步骤已生效,旧进程已被终止)。新部署的程序是daemon进程且运行正常,请问为何会出现该sudo密码请求?


问题分析与解决

核心原因

  1. 程序启动时隐性需要sudo权限:日志显示程序输出提示要用sudo tail -f查看/var/log/config_manager.log,说明/var/log/目录默认需要sudo权限才能写入。如果daemon程序启动时需要创建或写入这个日志文件,而当前部署用户没有对应权限,程序内部会触发sudo操作,导致终端等待密码输入,卡住流水线。
  2. 程序未完全脱离部署会话:直接执行./${BINARY_NAME}时,即使是daemon程序,若未重定向标准输入/输出/错误,会绑定到ssh远程会话上,导致会话无法正常关闭。此时sudo密码缓存可能已过期,残留的IO通道触发了隐性的sudo请求。

解决步骤

1. 给日志文件授权,避免启动时需要sudo

在部署脚本中添加权限修改命令,让部署用户能直接写入日志文件:

# 在启动程序前添加这一行
echo ${HOST_PASS} | sudo -S chown hft_001:hft_001 /var/log/config_manager.log

或者修改/var/log/目录权限,让部署用户组拥有写入权限,彻底解决权限问题。

2. 完全后台启动程序并重定向IO

修改deploy.sh中启动程序的命令,确保程序脱离当前会话:

echo "-> Running the freshly deployed app."
# 重定向所有IO到空设备并后台运行
./${BINARY_NAME} > /dev/null 2>&1 &
echo "-> Ran the freshly deployed app."

这样程序会完全在后台运行,不会占用ssh会话的IO通道,部署脚本可以顺利执行完毕并退出。

3. 调整sudo缓存时效(可选)

如果部署过程耗时超过5分钟(sudo默认密码缓存时长),可以修改sudoers文件的timestamp_timeout参数延长缓存时间,但这只是临时方案,优先解决权限问题更稳妥。


内容的提问来源于stack exchange,提问作者avernus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:50:23