51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
|
|
/*
|
|||
|
|
* @Author: haodaquan
|
|||
|
|
* @Date: 2017-06-21 12:55:19
|
|||
|
|
* @Last Modified by: haodaquan
|
|||
|
|
* @Last Modified time: 2017-06-21 13:03:06
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
package jobs
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"PPGo_Job/models"
|
|||
|
|
"fmt"
|
|||
|
|
"github.com/astaxie/beego"
|
|||
|
|
"os/exec"
|
|||
|
|
"time"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func InitJobs() {
|
|||
|
|
list, _ := models.TaskGetList(1, 1000000, "status", 1)
|
|||
|
|
for _, task := range list {
|
|||
|
|
job, err := NewJobFromTask(task)
|
|||
|
|
if err != nil {
|
|||
|
|
beego.Error("InitJobs:", err.Error())
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
AddJob(task.CronSpec, job)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func runCmdWithTimeout(cmd *exec.Cmd, timeout time.Duration) (error, bool) {
|
|||
|
|
done := make(chan error)
|
|||
|
|
go func() {
|
|||
|
|
done <- cmd.Wait()
|
|||
|
|
}()
|
|||
|
|
|
|||
|
|
var err error
|
|||
|
|
select {
|
|||
|
|
case <-time.After(timeout):
|
|||
|
|
beego.Warn(fmt.Sprintf("任务执行时间超过%d秒,进程将被强制杀掉: %d", int(timeout/time.Second), cmd.Process.Pid))
|
|||
|
|
go func() {
|
|||
|
|
<-done // 读出上面的goroutine数据,避免阻塞导致无法退出
|
|||
|
|
}()
|
|||
|
|
if err = cmd.Process.Kill(); err != nil {
|
|||
|
|
beego.Error(fmt.Sprintf("进程无法杀掉: %d, 错误信息: %s", cmd.Process.Pid, err))
|
|||
|
|
}
|
|||
|
|
return err, true
|
|||
|
|
case err = <-done:
|
|||
|
|
return err, false
|
|||
|
|
}
|
|||
|
|
}
|