上周五组内同事搭建了一个jenkins持续集成平台,完善了我们的安卓自动化系统。我们将产品的自动打包集成到里面,当天系统运行正常。周一回来正准备大干一场,突然发现系统无端关机了。OK,关机那就重启吧,半分钟后出现了登录界面,迫不及待的输入密码,[enter],结果界面一闪又重新回到了登录界面。咦!怎么回事?密码是没问题的,再次输入,现象一样!不会吧,难道系统被我们搞坏了?于是开始了长时间的定位过程。
文件权限问题
google搜索发现跟登录相关的文件是用户根目录下的.Xauthority文件,如果没有这个文件的读取权限就会出现“输入正确密码后重新返回登录界面”的问题。解决方法:
- ctrl+alt+f1切换到命令行模式
- 使用正确的用户名密码登录。
- 在home下查看该文件权限:
1
$ ls -al .Xauthority
很奇怪,执行ls命令提示找不到,说明出问题的机器找不到/bin/ls文件,看来是环境变量失效了,那就自己设定一个环境变量吧,执行以下命令:1
$ export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/games
再次执行ls命令1
2$ ls -al .Xauthority
-rw------- 1 staff staff 2727 Mar 21 2015 .Xauthority
上述结果显示文件是登录用户staff的,它有读写权限,因此没有问题,排除这种情况。
当然如果真的是这个问题可以执行以下命令解决1
$ sudo chown staff:staff .Xauthority
文件问题(.Xauthority)
继续google我们发现另一种解决办法:
- ctrl+alt+f1切换到命令行模式
- rm -rf .Xauthority
- ctrl+alt+f7切换回登录窗口
- 输入用户名密码登录
按照上述方法执行一次,问题依旧,无奈!
分析登录日志
以上方法都失效了,继续盲目的google看来意义不大。我们想到了系统日志,说干就干,再次进入命令行模式,查看文件/usr/log/auth.log。
通过auth.log的错误日志,我们花了近2小时尝试了很多办法,比较有代表性的解决方案有:
(1) 更新系统插件1
2$ sudo apt-get update
$ sudo apt-get upgrade
(2) 将部分系统插件会退到旧版本
尝试这两种方法是因为同事说在配置服务器的过程中点击了系统插件的更新,从错误日志中显示可能是插件不兼容导致。
(3) 更换桌面,切换成1
$ sudo apt-get install xubuntu-desktop
怀疑是gnome桌面出问题了,安装新的桌面可以解决这类问题。
很不幸的是所有的解决办法都失败了,我们这时快要崩溃了。
回归现象,峰回路转
在长时间折腾不出解决方案后,我们暂时放弃了,喝喝水并出去溜达了一圈。路上不时的想起定位过程,很快我们注意到第一步中那个奇怪的现象:“ls命令找不到,环境变量实效了!”。我们知道linux启动的时候是默认会初始化环境变量的,即unbuntu默认环境变量中应该会有这个值:1
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/games
快速回到工位,重启电脑,登录命令行模式,查看机器上的环境变量,执行以下命令:1
2$ /bin/echo $PATH
/Users/staff/.jenkins/bin
PATH竟然变成了“/Users/staff/.jenkins/bin”。查看jenkins安装指南,我们发现安装过程修改了系统文件/etc/profile,会向这个文件写入jenkins环境变量。查看之:1
2
3$ cat /etc/profile
... (去除不必要信息的干扰)
PATH=/Users/staff/.jenkins/bin
至此,问题看来已经找到了,linux启动会加载/etc/profile文件配置,因此问题机器PATH会最后修改为“/Users/staff/.jenkins/bin”。而桌面登录时依赖默认的环境变量,因此导致我们输入正确的密码也无法登录。
解决方法:将/etc/profile文件中PATH的赋值修改成下列形式。1
PATH=$PATH:/Users/staff/.jenkins/bin
重启机器,输入用户名密码,成功进入系统。
问题总结
- 定位过程其实走了很多弯路,而关键现象却选择性忽略了,不过借此机会也复习和学习了好些linux相关的配置和命令。
- linux系统文件非常敏感,修改时需特别注意
系统出问题了,极大的可能是修改了系统文件,因此,一个良好的习惯是系统文件修改前对文件进行备份,然后再进行修改,出问题后直接回滚往往可以马上解决问题。 - 当问题出现时,先分析全面问题的现象,然后再想解决方案
google大法确实很不错,但是如果盲目的搜索只会让问题更乱,折腾的更辛苦。但是如果分析清楚了现象,有时候自直接就能定位出问题,即使依赖google,现象清楚全面,搜索结果也会更加准确,需要1天解决的问题或许1小时(甚至更短时间)就搞定了。 - 问题定位没有头绪了,暂时抛开,或许会有新思路。
苏轼说:“不识庐山真面目,只缘身在此山中”,当我们困扰于问题时,可能我们已经纠结于问题的细枝末节了,而不能看到问题的全貌,这时走出庐山(暂时抛开),从不一样的角度去看它时,往往会有意外的收获。