普利茅斯检查卡住,导致服务无法进行

普利茅斯检查卡住,导致服务无法进行

这很奇怪。如果我这么做,说

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 中删除splashquiet替换它们进行调试时plymouth:debug普利茅斯调试,我所有的问题似乎都消失了。无需像上面那样编辑日志脚本。

这可能是 ubuntu 启动时与 plymouth 的一些竞争条件导致 plymouth 卡住。通过避免 splash,我能够避免这个问题。

在我发现这一点之前,我曾通过编辑 /lib/lsb/init.functions.d/50-ubuntu-logging 来进行破解,以便始终为 plymouth 使用返回 0(第一个函数)。但这对重启/启动问题没有帮助。

相关内容