golang 脚本卡住

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

参考

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用一些工具来自动生成测试脚本,比如GoConvey和Testify等。这些工具可以帮助你编写和运行测试,并生成测试报告。 使用GoConvey,你可以在项目中编写测试代码,并通过浏览器查看测试结果。首先,你需要在项目中安装GoConvey: ``` go get github.com/smartystreets/goconvey ``` 然后,在你的测试文件中导入GoConvey包,并使用`convey`函数创建一个测试套件: ```go package main_test import ( "testing" . "github.com/smartystreets/goconvey/convey" ) func TestMath(t *testing.T) { Convey("Given two numbers", t, func() { a := 2 b := 3 Convey("When adding them together", func() { sum := a + b Convey("The result should be correct", func() { So(sum, ShouldEqual, 5) }) }) }) } ``` 运行测试脚本: ``` goconvey ``` 这将启动一个Web界面,你可以在浏览器中查看测试结果。 另外一个流行的测试工具是Testify。你可以使用Testify编写更传统的单元测试,并生成测试报告。首先,你需要在项目中安装Testify: ``` go get github.com/stretchr/testify ``` 然后,你可以在你的测试文件中导入Testify包,并编写测试代码: ```go package main_test import ( "testing" "github.com/stretchr/testify/assert" ) func TestMath(t *testing.T) { a := 2 b := 3 sum := a + b assert.Equal(t, 5, sum) } ``` 运行测试脚本: ``` go test ``` 这将执行你的测试并生成测试报告。 这些工具都可以帮助你自动生成测试脚本,并且提供了丰富的断言函数和测试辅助工具,使得编写和运行测试更加方便。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值