golang 脚本卡住

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ACM__dongsheng/article/details/84928346

最近写了一个ftp脚本发送文件,本地测试没问题。对接对方公司却发生脚本卡住的情况。最后发现该设备上的ftp工具在对方断网之后,并不自动退出,给脚本加了运行时间。要注意的是,杀死脚本的时候,要杀死该脚本拉起来的子进程。

FTP脚本代码:

#!/bin/bash
IP_ADDRESS=$1
FILENAME=$2
PORT=$3
LOCAL_PATH=$4
USERNAME=$5
PASSWORD=$6
REMOTE_PATH=$7
REMOTE_DIRP=$8
REMOTE_DIR=$9
ftp -n<<EOF
open $IP_ADDRESS $PORT
user $USERNAME $PASSWORD
passive
binary
mkdir $REMOTE_PATH
cd $REMOTE_PATH
mkdir $REMOTE_DIRP
cd $REMOTE_DIRP
mkdir $REMOTE_DIR
cd $REMOTE_DIR
lcd $LOCAL_PATH
put $FILENAME
bye
EOF

golang 代码

func CmdRunWithTimeout(cmd *exec.Cmd, timeout time.Duration) (error, bool) {
done := make(chan error)
go func() {
	fmt.Println("aaaaaaa")
	done <- cmd.Wait()
}()

var err error
select {
case <-time.After(timeout):
	// timeout
	syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL)
	go func() {
		fmt.Println("ssss")
		<-done // allow goroutine to exit
	}()
	fmt.Println("process be killed")
	return err, true
case err = <-done:
	return err, false
}
}

func main() {
	cmd := exec.Command("/home/go/test_ex/test.sh")
	cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
	cmd.Start() // attention!
	CmdRunWithTimeout(cmd, time.Duration(6)*time.Second)
	for{
		time.Sleep(1*time.Second)
	}
}

参考

猜你喜欢

转载自blog.csdn.net/ACM__dongsheng/article/details/84928346