如何监控 geth 并在 monit 崩溃时自动重启它
如何监控 geth 并在 monit 崩溃时自动重启它

Monit monitors Geth, autorestarts it on crashes and sends email alerts. Good, good Monit!
我在一个低成本的数字海洋(DO) Ubuntu droplet 上运行 geth 和TheMillionEtherHomepage.com后端。我使用 monit 来自动重启 geth,并在进程出错时发送电子邮件提醒。
在这里,我将介绍一个可行的解决方案和一个不可行的漂亮的解决方案(希望有人能最终修复它)。
安装和设置监视器
$ sudo apt-get update
$ sudo apt-get install monit
备份配置文件,并开始用 nano 编辑它:
$ sudo cp /etc/monit/monitrc /etc/monit/monitrc-orig # backup
$ sudo nano /etc/monit/monitrc
允许访问监控状态。取消这些行的注释:
set daemon 120 # number of seconds between checkups
set httpd port 2812 and
use address localhost # only accept connection from localhost
allow localhost # allow localhost to connect to the server
让 monit 包含*。cfg 文件从它的 conf.d 目录。取消注释(或在最后添加):
include /etc/monit/conf.d/*.cfg
设置邮件服务器发送提醒。如果您使用的是 gmail,请添加以下几行:
# GMAIL
set mailserver smtp.gmail.com port 587
username "[email protected]" password "12345678"
using tlsv1
with timeout 30 seconds set alert [email protected] # monit will send alerts to this address
退出 nano 编辑器:Ctrl+X 要保存,键入 Y,按 enter,当它要求文件名时再次输入(保留相同的文件名)。
设置权限为 monitrc 现在有非常敏感的数据。
$ sudo chmod 600 /etc/monit/monitrc
为了更好地理解 monit:
设置 geth 监控—工作解决方案
使用 nano 创建并开始编辑 geth.cfg 文件:
$ sudo nano /etc/monit/monitrc/geth.cfg
粘贴此代码:
# GETH
CHECK PROCESS geth MATCHING "[g]eth.*fast"
start program = "/bin/bash -c 'geth --fast --rpc --rpcport 8545 --rpccorsdomain localhost --cache=16 >/dev/null 2> /home/my-logs-folder/geth.log'" as uid username as gid username
stop program = "/bin/bash -c 'kill -HUP $(ps aux | grep '[g]eth' | awk '{print $2}')'" as uid username as gid username
if not exist then alert
if not exist then restart
Ctrl+X 要保存,请键入 Y,按 enter 键,当它要求输入文件名时,再次按 enter 键。
- 我们在这里使用>/dev/null,因为 geth 将所有内容输出到 stderr(标准错误输出)。我们将所有 stderr 输出(即所有日志)保存到/home/my-logs-folder/geth.log 文件中。
- 我们使用-HUP 信号,因为-SIGINT(通常用 Ctrl+C 发送)不会到达 geth。
重新启动 monit:
$ sudo monit reload
当 geth 崩溃时,这个配置将完美地发送一封电子邮件给你,并将完美地自动重启 geth
酪这里的缺点是它不能通过 monit 向 geth 发送“graceful”-SIGINT 信号。而不得不改为 send -HUP,这想必是不安全的(用 SIGTERM 杀 geth 安全吗?)。我试了一下,效果不错,但是我更喜欢手动发送-SIGINT:
$ sudo monit unmonitor geth # so that monit won't restart geth again
$ PID_OF_GETH=`pidof geth` # get geth's process ID
$ kill -2 $PID_OF_GETH # KILL IT NOW!... but do it gracefully.
这是笨拙的。我试图让它更优雅,但失败了。在 stackexchange 贴了这个问题— 如何用 monit 监控并自动重启 geth?
设置监控—正确的方式
我知道配置看起来应该与此非常相似。
geth.cfg
# GETH
CHECK PROCESS geth with pidfile "/home/username/monit/geth.pid"
start program = "/bin/bash -c '/home/username/monit/geth.sh start'" as uid username as gid username
stop program = "/bin/bash -c '/home/username/monit/geth.sh stop'" as uid username as gid username
if not exist then alert
if not exist then restart
geth.sh
#!/bin/bash
PID='/home/username/monit/geth.pid'
LOGS='/home/username/monit/geth.log'
KEYS='\--fast --rpc --rpcport 8545 --rpccorsdomain localhost --ipcpath /home/username/.ethereum/geth.ipc --cache=16'
case $1 in
start)
setsid geth "$KEYS" &> "$LOGS" &
echo $! > "$PID"
;;
stop)
kill -SIGINT `cat "$PID"`
rm "$PID"
;;
*)
echo "usage: geth.sh {start|stop}"
;;
esac
exit 0
很漂亮不是吗?如果你知道如何让它工作,请在这里提交你的答案— 如何用 monit 监控和自动重启 geth?
获取监控状态
重新启动 monit 后,可以使用以下命令启动 geth:
$ sudo monit start geth
这将运行 geth,在崩溃时自动重启它,并在出错时通过电子邮件通知您。
您还可以通过以下命令检查 monit 状态:
$ sudo monit status
并且有一个这样的屏幕(mlneth 这里是我的项目的 python 后端):

Monitoring geth
祝你们监控愉快,没有任何警告!



