这很奇怪。如果我这么做,说
service jenkins start
它总是会冻结/卡住,就像在等待某些输入一样。所有服务和启动/停止命令也是如此。但是,如果我这样做
service jenkins start | cat
它可以正常工作。管道到 /dev/null 也可以工作。使用set -x
,我设法追踪了冻结的位置
+ '[' -z ']'
+ FANCYTTY=1
+ case "$FANCYTTY" in
+ true
+ /usr/bin/tput xenl
++ /usr/bin/tput cols
+ COLS=144
+ '[' 144 ']'
+ '[' 144 -gt 6 ']'
++ /usr/bin/expr 144 - 7
+ COL=137
+ log_use_plymouth
+ '[' n = y ']'
+ plymouth --ping
确实,它总是plymouth --ping
会冻结。也可以直接从 shell 中重现。有什么方法可以解决此问题吗?
Ubuntu 版本是 14.04.01。普利茅斯应该记录到 /var/log/boot.log,但我没有看到任何有用的东西,只有“停止”和“启动”行,结果是 OK。
与普利茅斯有关的进程列表如下:
$ ps -ef | grep plymou
root 478 1 0 Dec01 ? 00:00:04 plymouth-upstart-bridge
root 492 1 0 Dec01 ? 00:00:00 @sbin/plymouthd --mode=boot --attach-to-session
root 1710 1699 0 Dec01 ? 00:00:00 plymouth quit
root 1725 1411 0 Dec01 ? 00:00:00 plymouth --ping
root 48897 2140 0 12:12 pts/0 00:00:00 grep --color=auto plymou
strace plymouth --ping
显示如下:
connect(6, {sa_family=AF_LOCAL, sun_path=@"/org/freedesktop/plymouthd"}, 29) = 0
epoll_ctl(3, EPOLL_CTL_ADD, 6, {EPOLLERR|EPOLLHUP, {u32=31321216, u64=31321216}}) = 0
epoll_ctl(3, EPOLL_CTL_MOD, 6, {EPOLLERR|EPOLLHUP, {u32=31321216, u64=31321216}}) = 0
epoll_ctl(3, EPOLL_CTL_MOD, 6, {EPOLLOUT|EPOLLERR|EPOLLHUP, {u32=31321216, u64=31321216}}) = 0
epoll_wait(3, {{EPOLLOUT, {u32=31321216, u64=31321216}}}, 64, -1) = 1
sendto(6, "P\0", 2, MSG_NOSIGNAL, NULL, 0) = 2
epoll_ctl(3, EPOLL_CTL_MOD, 6, {EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP, {u32=31321216, u64=31321216}}) = 0
epoll_ctl(3, EPOLL_CTL_MOD, 6, {EPOLLIN|EPOLLERR|EPOLLHUP, {u32=31321216, u64=31321216}}) = 0
epoll_wait(3,
/var/log/upstart/plymouth.log 有一行:
error: unexpectedly disconnected from boot status daemon
答案1
事实证明,当我按照建议在 /etc/default/grub 中删除splash
和quiet
替换它们进行调试时plymouth:debug
普利茅斯调试,我所有的问题似乎都消失了。无需像上面那样编辑日志脚本。
这可能是 ubuntu 启动时与 plymouth 的一些竞争条件导致 plymouth 卡住。通过避免 splash,我能够避免这个问题。
在我发现这一点之前,我曾通过编辑 /lib/lsb/init.functions.d/50-ubuntu-logging 来进行破解,以便始终为 plymouth 使用返回 0(第一个函数)。但这对重启/启动问题没有帮助。