如何实现Jenkins SSH Slave断开后iOS归档任务仍持续执行?
解决SSH断开后iOS归档任务继续执行的问题
我之前也碰到过一模一样的情况——SSH连着Mac Slave跑半小时的iOS归档,结果中途连接断了,任务直接失败,心态都崩了!下面几个方法亲测有效,帮你彻底解决这个痛点:
方法一:用nohup直接让进程脱离终端(最简单)
nohup的核心作用就是让进程忽略终端挂起的信号,就算SSH断开,进程也会继续在后台执行。
具体操作步骤:
- 直接在SSH里用这个格式运行你的归档命令:
拆解一下参数:nohup xcodebuild archive -workspace YourApp.xcworkspace -scheme YourScheme -archivePath ./YourApp.xcarchive > archive.log 2>&1 &> archive.log把命令的标准输出写入archive.log文件,方便后续查看进度2>&1把错误输出也重定向到同一个日志文件,排查问题更方便- 最后的
&把进程放到后台运行,不占用当前终端
- 运行后可以用
ps aux | grep xcodebuild确认进程是否正常运行 - 就算SSH断开,任务也会继续执行,完成后你重新SSH上去看日志或归档文件就行
方法二:用screen或tmux创建持久会话(最灵活,推荐)
nohup虽然简单,但如果之后想实时查看任务输出就不太方便。screen和tmux可以创建一个持久的终端会话,你随时可以断开、重新连接,就像从来没离开过终端一样。
用screen的步骤:
- 如果Mac Slave上没装
screen,先安装:brew install screen - 创建一个命名会话(方便之后识别):
screen -S archive_task - 进入新终端窗口后,直接运行你的iOS归档命令
- 需要断开SSH时,按
Ctrl + A再按D,就能脱离这个会话,此时SSH断开不影响任务执行 - 重新SSH连接后,用下面的命令回到之前的会话:
screen -r archive_task - 忘了会话名的话,用
screen -ls可以查看所有正在运行的screen会话
用tmux的步骤(功能更强大,长期用推荐):
- 安装
tmux:brew install tmux - 创建命名会话:
tmux new -s archive_task - 在会话里运行归档命令,之后按
Ctrl + B再按D脱离会话 - 重新连接会话:
tmux attach -t archive_task - 查看所有会话:
tmux ls
方法三:用disown补救已启动的任务(临时救急)
如果你已经在SSH里启动了归档任务,才想起没做后台处理,别慌,用disown可以补救:
- 按
Ctrl + Z暂停当前运行的任务 - 输入
bg把暂停的任务放到后台继续运行 - 输入
jobs查看后台任务的编号(比如显示[1]+ Running...,编号就是1) - 输入
disown -h %1(把%1换成你的任务编号),这样SSH断开后,这个进程就不会被终止了
额外小技巧:减少SSH连接断开的概率
除了让任务脱离终端,你还可以优化SSH配置,降低连接断开的几率:
在本地的~/.ssh/config文件里添加以下内容(没有这个文件就创建一个):
Host your-mac-slave-hostname ServerAliveInterval 60 ServerAliveCountMax 3
解释:
ServerAliveInterval 60:每60秒向服务器发送一次心跳信号ServerAliveCountMax 3:如果连续3次心跳没得到响应,才断开连接
这样能大大减少SSH自动断开的情况,但还是建议结合前面的后台任务方法,双重保险更靠谱。
内容的提问来源于stack exchange,提问作者HarrisHan
相关产品推荐
相关产品推荐

