cronsun/models/node.go

63 lines
1.3 KiB
Go
Raw Normal View History

2017-01-09 03:10:55 +00:00
package models
2017-01-09 02:32:14 +00:00
2017-01-09 10:51:52 +00:00
import (
"os"
"strconv"
"syscall"
client "github.com/coreos/etcd/clientv3"
"sunteng/cronsun/conf"
)
2017-01-09 09:13:56 +00:00
// 执行 cron cmd 的进程
// 注册到 /cronsun/proc/<id>
2017-01-09 02:32:14 +00:00
type Node struct {
2017-01-09 09:13:56 +00:00
ID string `json:"-"` // ip
PID string `json:"pid"` // 进程 pid
2017-01-09 02:32:14 +00:00
}
2017-01-09 10:51:52 +00:00
func (n *Node) String() string {
return "node[" + n.ID + "] pid[" + n.PID + "]"
}
func (n *Node) Put(opts ...client.OpOption) (*client.PutResponse, error) {
return DefalutClient.Put(conf.Config.Proc+n.ID, n.PID, opts...)
}
func (n *Node) Del() (*client.DeleteResponse, error) {
return DefalutClient.Delete(conf.Config.Proc+n.ID, client.WithFromKey())
}
// 判断 node 是否已注册到 etcd
// 存在则返回进行 pid不存在返回 -1
func (n *Node) Exist() (pid int, err error) {
resp, err := DefalutClient.Get(conf.Config.Proc+n.ID, client.WithFromKey())
if err != nil {
return
}
if len(resp.Kvs) == 0 {
return -1, nil
}
if pid, err = strconv.Atoi(string(resp.Kvs[0].Value)); err != nil {
if _, err = DefalutClient.Delete(conf.Config.Proc+n.ID, client.WithFromKey()); err != nil {
return
}
return -1, nil
}
p, err := os.FindProcess(pid)
if err != nil {
return -1, nil
}
// TODO: 暂时不考虑 linux/unix 以外的系统
if p != nil && p.Signal(syscall.Signal(0)) == nil {
return
}
return -1, nil
}