启动二进制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密码请求?
问题分析与解决
核心原因
- 程序启动时隐性需要sudo权限:日志显示程序输出提示要用
sudo tail -f查看/var/log/config_manager.log,说明/var/log/目录默认需要sudo权限才能写入。如果daemon程序启动时需要创建或写入这个日志文件,而当前部署用户没有对应权限,程序内部会触发sudo操作,导致终端等待密码输入,卡住流水线。 - 程序未完全脱离部署会话:直接执行
./${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
相关产品推荐
相关产品推荐

