一.情况描述
今天在虚拟机使用时发现居然报错了拒绝连接,由于昨天才刚经历了mongod的错误因此第一反应就想到了是不是又是mongod出了什么幺蛾子。
对其使用命令查看发现果然状态又变成了failed,但是/var/lib/mongo下的文件依然存在,而在输入了昨天的解决方案的两句命令后mongod又可以正常启动了。
经过查询发现:
sudo命令在linux的系统中作用是临时提升了权限,而如果不怕麻烦的话每次启动都要输入这两句命令就很烦,正常的话mongod应该都不会自动关闭。
但是当前的情况每次使用都要依次输入
sudo chown -R mongod:mongod /usr/bin/mongod
sudo chown mongod:mongod /tmp/mongodb-27017.sock
systemctl start mongod
那这就非常的讨厌,查找了网上不少帖子也没找到什么有用的解释,
没什么办法只能是去编写一个脚本,让他通过脚本启动。
二.解决思路
脚本思路如下:
先去通过systemctl status mongod检查状态,active是failed的话就去依次运行那三句命令来启动我的mongod。
在/usr/local/bin下编写了自己的脚本起名为mongod-start.sh代码如下:
#!/bin/bash
# 定义颜色变量
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m' # No Color
# 定义一个函数来检查MongoDB服务的状态
check_mongod_status() {
# 使用systemctl获取MongoDB服务的状态
status=$(systemctl status mongod | grep -oP 'Active: \K.*')
echo -e "Current MongoDB status: ${GREEN}$status${NC}"
return $(( $(echo "$status" | grep -wc 'failed') ))
}
# 调用函数并检查MongoDB服务的状态
check_mongod_status
# 根据函数返回值(0表示非failed,非0表示failed)来执行操作
if [ $? -ne 0 ]; then
echo -e "${RED}MongoDB service失败,尝试重启${NC}"
# 尝试修改MongoDB可执行文件和socket文件的权限
if sudo chown -R mongod:mongod /usr/bin/mongod; then
echo "Permission changed for /usr/bin/mongod"
else
echo -e "${RED}sudo chown -R mongod:mongod /usr/bin/mongod 运行失败${NC}"
exit 1
fi
if [ -e /tmp/mongodb-27017.sock ]; then
if sudo chown mongod:mongod /tmp/mongodb-27017.sock; then
echo "Permission changed for /tmp/mongodb-27017.sock"
else
echo -e "${RED}sudo chown mongod:mongod /tmp/mongodb-27017.sock 运行失败${NC}"
fi
fi
# 尝试重新启动MongoDB服务
if sudo systemctl start mongod; then
echo -e "${GREEN}MongoDB service restarted successfully${NC}"
echo -e "MongoDB service status after restart:"
systemctl status mongod
else
echo -e "${RED}重启mongod失败${NC}"
fi
else
echo -e "${GREEN}MongoDB service 正常运行中,无需操作.${NC}"
fi
如何保存之后给其赋权限让其能够更加自由的执行
chmod 777 mongod-start.sh
这样直接mongod-start.sh回车后运行脚本就会开始
判断当前mongod运行状态,如果正常执行就什么都不做,打印出正常运行中,无需操作。
若是失败就依次开始
sudo chown -R mongod:mongod /usr/bin/mongod
并返回该命令的执行结果
sudo chown mongod:mongod /tmp/mongodb-27017.sock
并返回该命令的执行结果
systemctl start mongod
启动mongod
systemctl status mongod
返回执行完三条命令mongod状态
至此我的解决思路实现虽然还是要输入一下mongod-start.sh但比输入三条命令要更加的简单,
如果有需要在虚拟机使用mongod而不是像我一样在关联的datagrip等可视化软件操作的话。就在脚本的最后添加上mongod使其运行完成自动在虚拟机中进入mongod操作页面。
三.后续情况
上午完成了脚本后,特意关掉了虚拟机,可是在下午重新启动后却发现不会再次出现mongod被关闭权限不够的情况了。非常的讨厌白费功夫了。
根据本人的猜测可能是因为/var/lib/mongo比起昨天初次解决问题的时候已经有了相关文件,因此今天再次赋予了权限之后可能就没什么问题了。而上午之所以会出现这种问题是因为在第一次输入赋予权限的命令后,/var/lib/mongo下的文件出现了,但是没有再次赋予因此/var/lib/mongo下的文件可能有些问题。
因此整个mongod问题到此应该是彻底结束了
在安装完成后面对权限不够的问题执行如下命令
sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chown mongodb:mongodb /tmp/mongodb-27017.sock
systemctl start mongod
这样/var/lib/mongo下出现相关文件并且可以正常启动。
但是第一次关闭虚拟机后再次启动依然会出现这个问题
再次执行这三条命令
sudo chown -R mongodb:mongodb /var/lib/mongodb
sudo chown mongodb:mongodb /tmp/mongodb-27017.sock
systemctl start mongod
这次便是永久生效彻底解决了问题。
如果有同样问题的小伙伴可以试一下我第二步里的脚本文件,但是由于我下午并未出现问题因此执行脚本之后我并没有得到在异常情况下是否有用的结果,不过逻辑应该是没有什么大的问题。