![Ubuntu:“达到目标关闭”,可以安全地拔掉插头吗?](https://linux22.com/image/127539/Ubuntu%EF%BC%9A%E2%80%9C%E8%BE%BE%E5%88%B0%E7%9B%AE%E6%A0%87%E5%85%B3%E9%97%AD%E2%80%9D%EF%BC%8C%E5%8F%AF%E4%BB%A5%E5%AE%89%E5%85%A8%E5%9C%B0%E6%8B%94%E6%8E%89%E6%8F%92%E5%A4%B4%E5%90%97%EF%BC%9F.png)
我有一台运行 Ubuntu 16.04.3 LTS 的小型 Celeron 机器,每次我需要重新启动它(大约每月一次)时,我都必须关闭它的电源,拔掉插头,然后再次打开它。
问题是它不会自动重新启动,因为它会停止并显示一条消息Reached target Shutdown
。因此,我已停止使用sudo reboot
,而是改为使用sudo poweroff
,不久之后就会出现该消息。
当我等待几分钟时,会显示一条附加消息3102533.654120 unregister_netdevice: waiting for lo to become free. Usage count=1
。第二个(如时间测量)计数器很高,约为 3102533,相当于约 36 天,可能是上次重新启动的时间。所以后台仍然有一些东西在运行,发出该消息。
由于这种情况以前已经发生过,并且大多数 Google 命中都与 Docker 有关,因此我确保停止所有容器docker stop $(docker ps -a -q)
,并sudo systemctl stop docker
在发布sudo poweroff
.
在这种奇怪的断电状态下,也无法通过正常按下电源按钮来关闭机器电源(长按会关闭机器电源,iirc),并且按下重置按钮也不会重新启动机器,我发现这很奇怪。它是http://www.asrock.com/mb/Intel/N3150DC-ITX/
让我最担心的是“hdd”灯(它是一个 SSD)偶尔闪烁,就好像它正在与光盘交互一样,这让我担心拔掉电源插头时会损坏某些东西。https://www.youtube.com/watch?v=T3ojE1un7WE
拔掉插头安全吗?我怎样才能找到这个问题的原因?我无法对机器进行太多重新启动,因为它托管着一些不断被访问的数据库。
以上为2月12日,以下为3月16日
我刚刚再次“重新启动”机器。与上面的过程相同,因为它不会关闭。
这次我在重新启动之前没有执行任何操作apt upgrade/dist-upgrade
,而是在重新启动之后执行此操作,以确保正在升级的某些内容不是导致此问题的原因。
在等待它关闭的过程中,我按了几次 ctrl-alt-del ,但没有效果,直到出现一条消息:
2秒内按Ctrl-Alt-Del超过7次,立即重启
(我不认为我按得那么快,我相信它们以某种方式被缓存或者我按了很长时间)然后是
2697473.41.. systemd-shutdown[1]:无法最终确定 DM 设备,忽略(DM 之前的额外空格是该消息的一部分)
然后一个
2697473.63..reboot:重新启动系统
但无法重新启动,硬盘指示灯仍会偶尔闪烁,显示屏不会清除消息。
按重置按钮不会重置机器。按钮没有故障。
长按电源按钮可关闭机器电源。再按一次重新启动它,然后重置按钮按预期工作,我可以随时按它,它会导致系统立即重新启动。
开机后,我执行了 apt update/upgrade/dist-upgrade 并再次 sudo poweroff'ed 。关机就好了。
当机器开机几天时,会发生一些非常奇怪的事情,这肯定是导致此问题的原因。
我正在使用molly-guard
,我不确定这是否会导致一些问题。当我发出 时,sudo shutdown
我是在连接的键盘上本地执行的,所以molly-guard
没有效果。但我怀疑这molly-guard
就是问题的根源。
我top -b > test-pre-reboot-no-upgrade.txt
在发布之前做了一个sudo shutdown
,这是输出https://pastebin.com/nZnJzRKu
答案1
尝试添加nolapic
参数grub.cfg
跑步
sudo update-grub
https://help.ubuntu.com/community/BootOptions
帮助过我
在这里尝试了这些参数noapic
nolapic
noacpi
irqpoll
noapm
nodma
nomce
否则它没有帮助。解决了问题-重新编译initramfs:
sudo update-initramfs -u
答案2
我认为这个问题与安装硬盘/固态硬盘有关。
我正在做的是,在 crontab 中我有一个 @reboot startup.sh
shell 脚本,该脚本由主用户(uid 1000)执行,并且该脚本安装 HDD(它曾经是 HDD,现在是 SSD):
sudo mount /dev/sdb1 /media/ssd1
然后我所做的是创建一个shutdown.sh
如下所示的脚本:
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Ensure that this is desired
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo ""
echo "---- do you really want to shutdown/reboot? ----"
echo ""
read -n 1 -p "no, yes? (N/y) " ans;
case $ans in
y|Y) printf "\n\nok, preparing for shutdown/reboot\n\n";;
*) printf "\nok, exited\n\n"; exit;;
esac
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# DOCKER
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo ''
echo '--| stopping docker portainer |--';
echo ''
docker stop portainer
... stop more containers
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Python
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo ''
echo '--| killing all python processes |--';
echo ''
sudo pkill python
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# MongoDB
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo ''
echo '--| exiting mongodb instances |--';
echo ''
mongod --dbpath /media/ssd1/data/mongodb/network/wiredTiger --shutdown
... stop more databases
echo ''
echo '--| deleting old mongodb logs |--';
echo ''
exec rm -rf {} \;"
sudo sh -c "find /media/ssd1/data/mongodb -type f -name 'log.txt.*' -exec du -ch {} + | sort -h"
sudo sh -c "find /media/ssd1/data/mongodb -type f -name 'log.txt.*' -exec rm -rf {} \;"
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Sync
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo ''
echo '--| syncing discs |--';
sync
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# SSD
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo ''
echo '--| unmounting ssd1 and hdd5-1 |--';
echo ''
sudo umount /media/ssd1/
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Ask for next step
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo ""
echo "---- ok, done. what next? ----"
echo ""
read -n 1 -p "exit, reboot, or shutdown? (E/r/s) " ans;
case $ans in
r|R) printf "\n\nok, rebooting\n\n"; sudo reboot </dev/null;;
s|S) printf "\n\nok, powering off\n\n"; sudo poweroff </dev/null;;
*) printf "\nok, exited\n\n"; exit;;
esac
这样我就可以关闭和重新启动系统。因此,可能与未明确卸载驱动器以及在关闭/重新启动之前未发出同步有关。
正如评论中提到的,我注意到一个容器 (RabbitMQ) 正在生成一个巨大的日志文件(增长到大约 40 GB)。也许同步此文件导致了麻烦,它试图在几乎断电的状态下同步它。但我不确定,因为我几乎从一开始就遇到了这个问题,而且据我所知,我最初并没有运行 RabbitMQ。