最近写了一个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)
}
}
参考