编写安装Docker的bash脚本时错误仍输出到终端问题咨询
问题原因及解决方案
1. 报错仍打印到终端的原因
你当前仅对命令的标准输出(stdout,文件描述符1)做了追加重定向,而apt这类命令的报错信息会输出到标准错误输出(stderr,文件描述符2),默认直接输出到终端,不会写入你指定的logs.txt文件。
同时你脚本中curl、gpg、docker --version等命令完全没有加重定向规则,执行输出也会直接打印到终端。
修复重定向的方法
- 对需要隐藏所有输出的apt命令,将原
>> logs.txt修改为>> logs.txt 2>&1,即可同时将标准输出和标准错误都追加到日志文件中,Bash环境下也可以简写为&>> logs.txt - 其他需要隐藏输出的命令也对应添加上述重定向规则即可。
2. dpkg锁报错的原因
该报错说明当前系统中存在其他进程正在占用dpkg包管理工具,常见场景包括:
- 系统后台正在执行自动更新任务
- 其他终端窗口正在运行apt/dpkg相关的安装/卸载操作
- 上一次apt命令异常中断,遗留了锁文件
修复dpkg锁的方法
- 先执行
ps aux | grep -E 'apt|dpkg'检查是否有正在运行的相关进程,若存在可等待进程执行完成,或确认进程无用后执行sudo kill <进程ID>终止 - 确认无相关运行进程后,可执行
sudo rm /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock删除遗留的锁文件即可。
3. 脚本其他遗漏问题
你当前脚本在添加Docker GPG密钥后,缺少添加Docker软件源、更新apt索引的步骤,后续直接安装docker-ce会报找不到软件包的错误,需要补充对应步骤:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update >> logs.txt 2>&1
内容的提问来源于stack exchange,提问作者badman
相关产品推荐
相关产品推荐

