用go写一个简单的看门狗程序(WatchDog)
简述
因为公司的一些小程序只是临时使用一下(不再维护更新),有的有一些bug会导致崩溃,但又不是很严重,崩溃了重新启动一下就好。
所以写了一个看门狗程序来监控程序,挂了(因为我这里并不关心程序的其他状态)就直接重启。
参考:软件看门狗程序
代码
package main
import (
"fmt"
"log"
"os"
"os/exec"
"os/signal"
"path/filepath"
"strings"
"syscall"
)
func main() {
argc := len(os.Args)
if argc < 2 {
fmt.Println("Usage:", os.Args[0], " pragram args...")
return
}
workdir, err := os.Getwd()
if err != nil {
fmt.Println("运行错误", err.Error())
}
name := os.Args[1]
args := os.Args[1:]
{
if filepath.Base(name) == name {
if lp, err := exec.LookPath(name); err != nil {
log.Println("找不到待执行程序", err.Error())
return
} else {
name = lp
}
}
}
log.Println("程序工作路径:", workdir)
var cmdline string = strings.Join(args," ")
log.Println("开始运行:", cmdline)
var cmd *exec.Cmd
//创建监听退出chan
c := make(chan os.Signal)
//监听指定信号 ctrl+c kill
signal.Notify(c, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
go func() {
for s := range c {
switch s {
case syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT:
log.Println("信号退出", s)
err = cmd.Process.Kill()
if err != nil {
log.Println("清理程序资源:", err.Error())
}
os.Exit(0)
}
}
}()
for {
cmd = &exec.Cmd{
Path: name,
Args: args,
Dir: workdir,
Stdin: os.Stdin,
Stdout: os.Stdout,
Stderr: os.Stderr,
}
// log.Println(cmd.Args)
err = cmd.Run()
if err != nil {
log.Println("程序运行错误:", err.Error())
err = cmd.Process.Kill()
if err != nil {
log.Println("清理程序资源:", err.Error())
}
log.Println("开始重启程序")
continue
}
exitcode := cmd.ProcessState.ExitCode()
if exitcode != 0 {
log.Println("程序错误退出:", exitcode)
log.Println("开始重启程序")
continue
}
break
}
log.Println("正常退出程序")
}
用go写一个简单的看门狗程序(WatchDog)的更多相关文章
- linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...
- 【Linux开发】linux设备驱动归纳总结(十一):写个简单的看门狗驱动
linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- 用java代码写一个简单的网上购物车程序
需求:1.写一个商品类,有商品编号.商品名称.商品分类.商品单价属性.2.写一个商品条目信息类,有商品和数量两个属性,有商品总价格方法. 3.写一个购物车类,有添加商品方法.查看订单信息,删除商品,修 ...
- 参考MySQL Internals手册,使用Golang写一个简单解析binlog的程序
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. MySQL作为最流行的开源关系型数据库,有大量的拥趸.其生态已经相当完善,各项特性在圈内都有大量研究.每次新特性发布,都会 ...
- Cocoa练习01:一个简单的Todo list程序
写一个简单的todo list程序,界面如下图: 在TextField区域输入文字,点击Add按钮会将文字显示在下面的TableView列表中.TableView列表有2列,第一列是文字的输入时间:第 ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 如何写一个简单的http服务器
最近几天用C++写了一个简单的HTTP服务器,作为学习网络编程和Linux环境编程的练手项目,这篇文章记录我在写一个HTTP服务器过程中遇到的问题和学习到的知识. 服务器的源代码放在Github. H ...
- 如何写一个简单的shell
如何写一个简单的shell 看完<UNIX环境高级编程>后我就一直想写一个简单的shell来作为练习,因为有事断断续续的写了好几个月,如今写了差不多来总结一下. 源代码放在了Github: ...
- 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”
这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...
随机推荐
- OpenSessionInViewFilter 的配置及替代方案
OpenSessionInViewFilter 的配置及替代方案 博客分类: hibernate OpenSessionInViewFilter 的配置及替代方案 Spring 为我们提供了一个叫做 ...
- 号称全站最直观解释-smv核函数-是干啥
认识 svm 在求解时, 通过某非线性变换 φ( x) ,将输入空间映射到高维特征空间.特征空间的维数可能非常高.如果支持向量机的求解只用到内积运算,而在低维输入空间又存在某个函数 K(x, x′) ...
- Shell 编程 case语句
本篇主要写一些shell脚本case语句的使用. 字符判断 #!/bin/bash read -p "请输入一个字符:" char case $char in [a-z]|[A-Z ...
- H3C FAT AP
- Nikto 扫描工具
一.渗透步骤 信息收集 (被动的信息收集,主动的信息收集) 扫描探测 制定攻击方向 渗透 留后门 课堂分享: 书籍: <使用kali Linux进行web渗透测试>--书中部分工具已经无法 ...
- pandas的pivot_table
参考文献: [1]pivot_table
- XML炸弹
XML炸弹XML document type definition (DTD)可以定义entity,DTD可以出现在外部文件或文件内部.利用DTD可以产生XML炸弹,也就是能迅速占用大量内存的文件,如 ...
- [转]etcdctl v2 v3 使用指南
原文:https://blog.csdn.net/kozazyh/article/details/79586530 ------------------------------------------ ...
- jenkins中jmeter项目流程图
- Angular pagination分页模块 只提供分页参数处理 不处理分页记录数据
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...