记录一次排除mongodb bug的过程。

又是 debug,debug,debug,不想学习的一天!~ ~

由于从MongoDB 4.2开始,db.collection.update()可以使用聚合管道进行更新,所以我觉定将mongodb从3.6升级到4.4。。。。。。通过官网给出的方法下载 mongodbapt-get install -y mongodb-org后,发现不能用 service 命令启动,打开/etc/init.d/后发现没有 service 文件,于是决定自己写个,凑合用。

最后服务器上的好不容易更新完了,mac上的又坏了。。。这里记一下解决方法。。

将文件夹设置成可写状态(不设置则异常退出时无法修改导致不能使用)

1
sudo chown -R `id -un` /data/db

ubuntu service 文件

编写服务文件,就和编写.sh 脚本一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 先导入一个函数库,(包括了 log_daemon_msg, log_end_msg函数, 这两个函数相当于一个UI,status_of_proc返回进程的状态)
. lib/lsb/init-functions
MONGOD="/usr/bin/mongod"
CONFIG="/etc/mongod.conf"
NAME="mongod"
do_start()
{
sh -c "start-stop-daemon --start -m --pidfile /run/mongodb/mongod.pid -q --background --exec $MONGOD -- '-f' '$CONFIG'"
return "$?"
}
do_stop()
{
sh -c "start-stop-daemon --stop -q --pidfile /run/mongodb/mongod.pid"
return "$?"
}


case "$1" in
"start")
log_daemon_msg "Start" "$NAME"
do_start
case "$?" in
0)
log_end_msg 0
;;
1)
log_end_msg 1
echo "$NAME already run"
esac
;;
"stop")
log_daemon_msg "Stop" "$NAME"
do_stop
case "$?" in
0)
log_end_msg 0
;;
1)
log_end_msg 1
esac
;;
# 没有这个status的话,执行service --status-all就看不到这个进程
"status")
status_of_proc -p /run/mongodb/mongod.pid mongod mongod
exit $?
esac

log_daemon_msg, log_end_msg

UI讲完了,来讲下service文件最重要的一个函数,start-stop-daemon它可以启动和停止系统守护程序

介绍几个常用参数。

  • 启动
  • –start 表示启动系统守护程序
  • –pidfile 表示程序启动后进程pid的存放文件(通常放在/run中)
  • -m 和 –pidfile 搭配使用,如果pidfile指定的文件不存在,就创建一个文件。
  • -q 表示不要输出警告
  • –exec 启动程序的命令 (如果遇到指令,例如本文的mongod -f这个-f就需要写成--'f'
  • 停止
  • –stop 表示停止系统守护进程
  • –pidfile 指定要停止进程的pidfile

接下来在说一下status_of_proc这个函数,它可以判断一个进程的状态。当我们执行service --status-all时可以看到所有进程的开关状态,其中就是使用了这个函数。

这个函数有三个参数比较重要

  • -p 存放该进程pid的文件
  • $1 程序的路径
  • $2 执行service mongodb status时,显示的名称

-p 和 $1只要有一个正确好像就能正确使用,但最好是都写上。(就到这吧。。。不想看那个init-functions函数库了)