英文:
restart or shutdown golang apps programmatically
问题
所以我需要编写一个程序,可以通过编程方式运行、重新启动或关闭。我需要从终端执行以下操作:
project> go run app.go
应用已启动,等待5秒...
project>
另一种情况:
project> go run app.go runner.go
从app.go启动应用
从runner.go检测到app.go
应用在10秒后从app.go重新启动
程序将类似于以下内容:
package main
import (
    "something"
)
func main() {
    something.KillPrograms({
        doingWhatever() //这里是我的程序
    }, 5000) //程序将仅运行5秒钟
}
有没有什么库或者Go语言的东西可以做到这样的效果?谢谢。
英文:
so i need to make a program than can run, then restart or shutdown programmatically. I need to do like this from terminal:
project> go run app.go
apps started, waiting for 5 sec...
project>
other scenario:
project> go run app.go runner.go
apps started from app.go
runner detecting app.go from runner.go
app restarted after 10 sec from app.go
The program will be something like below:
package main
import(
    "something"
)
func main () {
    something.KillPrograms({
        doingWhatever() //my program here
   }, 5000) //program will running for only 5 sec
}
any library or anything from golang can do like that? thanks.
答案1
得分: 2
你可以尝试使用time.Sleep。
package main
import (
    "fmt"
    "time"
)
func main() {
    // 使用goroutine将函数单独运行
    // 如果你想要同步执行,可以移除`go`
    go 做一些事情()
    // 程序将在5秒后退出
    // 即使你的函数还没有执行完毕
    time.Sleep(5 * time.Second)
    os.Exit(0)
}
请注意,这是一个示例代码,其中的做一些事情()函数需要根据你的实际需求进行定义和实现。
英文:
You can try with time.Sleep
package main
import (
    "fmt"
    "time"
)
func main() {
    //use goroutine to run your function separately
    //if you want it's sync, you can remove `go`
    go doingWhatever()
    //after 5 seconds, the program will exit 
    //even though your function has not been done yet
    time.Sleep(5 * time.Second)
    os.Exit(0)
}
答案2
得分: 1
我刚刚尝试了这段简单的代码,它会每2秒重新启动自己,并在此期间运行一个随机检查来关闭程序。
package main
import (
	"fmt"
	"math/rand"
	"os"
	"os/exec"
	"runtime"
	"sync"
	"syscall"
	"time"
)
var wg sync.WaitGroup
func main() {
	t1 := time.NewTimer(time.Second * 2)
	wg.Add(1)
	// 你可以通过编程方式处理重启
	go func() {
		defer wg.Done()
		<-t1.C
		fmt.Println("Timer expired")
		RestartSelf()
	}()
	fmt.Println(time.Now().Format("2006-Jan-02 ( 15:04:05)"))
	rand.Seed(time.Now().UnixNano())
	// 你可以通过编程方式处理关闭
	if rand.Intn(3) == 1 {
		fmt.Println("It is time to shut-down")
		os.Exit(0)
	}
	wg.Wait()
}
func RestartSelf() error {
	self, err := os.Executable()
	if err != nil {
		return err
	}
	args := os.Args
	env := os.Environ()
	// Windows 不支持 exec 系统调用。
	if runtime.GOOS == "windows" {
		cmd := exec.Command(self, args[1:]...)
		cmd.Stdout = os.Stdout
		cmd.Stderr = os.Stderr
		cmd.Stdin = os.Stdin
		cmd.Env = env
		err := cmd.Run()
		if err == nil {
			os.Exit(0)
		}
		return err
	}
	return syscall.Exec(self, args, env)
}
输出结果:
2022-Mar-10 ( 17:59:53)
Timer expired
2022-Mar-10 ( 17:59:55)
Timer expired
2022-Mar-10 ( 17:59:57)
It is time to shut-down
进程以退出码 0 结束
英文:
Many libraries can handle restart/watch of the program. check this answer or this one.
I just tried this simple code that will restart itself each 2 seconds and during that he will run a random check to shutdown.
package main
import (
	"fmt"
	"math/rand"
	"os"
	"os/exec"
	"runtime"
	"sync"
	"syscall"
	"time"
)
var wg sync.WaitGroup
func main() {
	t1 := time.NewTimer(time.Second * 2)
	wg.Add(1)
	// you can handle to restart programmatically
	go func() {
		defer wg.Done()
		<-t1.C
		fmt.Println("Timer expired")
		RestartSelf()
	}()
	fmt.Println(time.Now().Format("2006-Jan-02 ( 15:04:05)"))
	rand.Seed(time.Now().UnixNano())
	// you can handle the shut-down programmatically
	if rand.Intn(3) == 1 {
		fmt.Println("It is time to shut-down")
		os.Exit(0)
	}
	wg.Wait()
}
func RestartSelf() error {
	self, err := os.Executable()
	if err != nil {
		return err
	}
	args := os.Args
	env := os.Environ()
	// Windows does not support exec syscall.
	if runtime.GOOS == "windows" {
		cmd := exec.Command(self, args[1:]...)
		cmd.Stdout = os.Stdout
		cmd.Stderr = os.Stderr
		cmd.Stdin = os.Stdin
		cmd.Env = env
		err := cmd.Run()
		if err == nil {
			os.Exit(0)
		}
		return err
	}
	return syscall.Exec(self, args, env)
}
output
2022-Mar-10 ( 17:59:53)
Timer expired
2022-Mar-10 ( 17:59:55)
Timer expired
2022-Mar-10 ( 17:59:57)
It is time to shut-down
Process finished with the exit code 0
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论