执行本地命令,超时后kill进程

pull/21/merge
ouqiang 8 years ago
parent f99db815de
commit 56144ee1a9

@ -15,6 +15,20 @@ func ExecShell(command string, args ...string) (string, error) {
return string(result), err
}
// 执行shell命令可设置执行超时时间
func ExecShellWithTimeout(timeout int, command string, args... string) (string, error) {
cmd := exec.Command(command, args...)
d := time.Duration(timeout) * time.Second
timer := time.AfterFunc(d, func() {
// 执行超时kill进程
cmd.Process.Kill()
})
output ,err := cmd.CombinedOutput()
timer.Stop()
return string(output), err
}
// 生成长度为length的随机字符串
func RandString(length int64) string {
sources := []byte("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

@ -29,8 +29,10 @@ func Create(ctx *macaron.Context) {
}
ctx.Data["Title"] = "任务管理"
ctx.Data["Hosts"] = hosts
if len(hosts) > 0 {
ctx.Data["FirstHostName"] = hosts[0].Name
ctx.Data["FirstHostId"] = hosts[0].Id
}
ctx.HTML(200, "task/task_form")
}

@ -9,8 +9,9 @@ import (
"github.com/ouqiang/gocron/modules/logger"
"github.com/ouqiang/gocron/modules/ssh"
"github.com/jakecoffman/cron"
"github.com/ouqiang/gocron/modules/utils"
"strings"
"github.com/ouqiang/gocron/modules/utils"
"errors"
)
var Cron *cron.Cron
@ -57,16 +58,21 @@ type Handler interface {
}
// 本地命令
type LocalCommandHandler struct {}
func (h *LocalCommandHandler) Run(taskModel models.TaskHost) (string, error) {
args := strings.Split(taskModel.Command, " ")
if len(args) > 1 {
return utils.ExecShell(args[0], args[1:]...)
if taskModel.Command == "" {
return "", errors.New("invalid command")
}
return utils.ExecShell(args[0])
fields := strings.Split(taskModel.Command, " ")
var args []string
if len(fields) > 1 {
args = fields[1:]
} else {
args = []string{}
}
return utils.ExecShellWithTimeout(taskModel.Timeout, fields[0], args...)
}
// HTTP任务

@ -37,7 +37,7 @@
<input type="text" name="db_port" value="3306">
</div>
</div>
<div class="two fields">
<div class="three fields">
<div class="field">
<label>用户名</label>
<input type="text" name="db_username">
@ -47,7 +47,7 @@
<input type="text" name="db_password">
</div>
</div>
<div class="two fields">
<div class="three fields">
<div class="field">
<label>数据库名称</label>
<input type="text" name="db_name">
@ -57,19 +57,19 @@
<input type="text" name="db_table_prefix" value="cron_">
</div>
</div>
<div class="two fields">
<div class="three fields">
<div class="field">
<label>管理员账号</label>
<input type="text" name="admin_username">
</div>
</div>
<div class="two fields">
<div class="three fields">
<div class="field">
<label>管理员密码</label>
<input type="text" name="admin_password">
</div>
</div>
<div class="two fields">
<div class="three fields">
<div class="field">
<label>管理员邮箱</label>
<input type="text" name="admin_email">

Loading…
Cancel
Save