首页系统综合问题Gin框架优雅关机和重启

Gin框架优雅关机和重启

时间2023-01-25 18:18:50发布分享专员分类系统综合问题浏览37

今天小编给各位分享win7设置定时关机命令的知识,文中也会对其通过Gin框架优雅关机和重启和Linux关机和重启命令及区别等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现在进入正文!

内容导航:

  • Gin框架优雅关机和重启
  • Linux关机和重启命令及区别
  • 关机和重启在Linux Kernel中的哪些函数里实现
  • 如何使用命令实现远程关机和重启
  • 一、Gin框架优雅关机和重启

    一 背景

    我们编写的Web项目部署之后,经常会因为需要进行配置变更或功能迭代而重启服务,单纯的kill -9 pid的方式会强制关闭进程,这样就会导致服务端当前正在处理的请求失败,那有没有更优雅的方式来实现关机或重启呢?

    阅读本文需要了解一些UNIX系统中信号的概念,请提前查阅资料预习。

    二 实现方案2.1 Linux 信号2.1.1 信号名称与编号

    每个信号都有一个名字和编号,这些名字都以“SIG”开头,例如“SIGIO ”、“SIGCHLD”等等。 信号定义在signal.h头文件中,信号名都定义为正整数。 具体的信号名称可以使用kill -l来查看信号的名字以及序号,信号是从1开始编号的,不存在0号信号。kill对于信号0又特殊的应用。

    root@1204nStrive:~# kill -l 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR111) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+338) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+843) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-758) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-263) SIGRTMAX-1  64) SIGRTMAX复制代码
    2.1.2 信号处理

    信号的处理有三种方法,分别是:忽略、捕捉和默认动作

    忽略信号,大多数信号可以使用这个方式来处理,但是有两种信号不能被忽略(分别是 SIGKILL和SIGSTOP)。因为他们向内核和超级用户提供了进程终止和停止的可靠方法,如果忽略了,那么这个进程就变成了没人能管理的的进程,显然是内核设计者不希望看到的场景捕捉信号,需要告诉内核,用户希望如何处理某一种信号,说白了就是写一个信号处理函数,然后将这个函数告诉内核。当该信号产生时,由内核来调用用户自定义的函数,以此来实现某种信号的处理。系统默认动作,对于每个信号来说,系统都对应由默认的处理动作,当发生了该信号,系统会自动执行。不过,对系统来说,大部分的处理方式都比较粗暴,就是直接杀死该进程。 具体的信号默认动作可以使用man 7 signal来查看系统的具体定义。在此,我就不详细展开了,需要查看的,可以自行查看。也可以参考 《UNIX 环境高级编程(第三部)》的 P251——P256中间对于每个信号有详细的说明。2.2 优雅关机2.2.1 什么是优雅关机

    优雅关机就是服务端关机命令发出后不是立即关机,而是等待当前还在处理的请求全部处理完毕后再退出程序,是一种对客户端友好的关机方式。而执行Ctrl+C关闭服务端时,会强制结束进程导致正在访问的请求出现问题。

    2.2.2 实现优雅关机

    Go 1.8版本之后,http.Server 内置的Shutdown() 方法支持优雅关机,如下

    三 实战3.1 http.Server 内置Shutdown()方法
    package mainimport ("context""log""net/http""os""os/signal""syscall""time""github.com/gin-gonic/gin")// @title Docker监控服务// @version 1.0// @description gin shutdown// @contact.name API Support// @contact.url http:///fvbock/endless""github.com/gin-gonic/gin")func main() {router := gin.Default()router.GET("/", func(c *gin.Context) {time.Sleep(5 * time.Second)c.String(http.StatusOK, "hello gin!")})// 默认endless服务器会监听下列信号:// syscall.SIGHUP,syscall.SIGUSR1,syscall.SIGUSR2,syscall.SIGINT,syscall.SIGTERM和syscall.SIGTSTP// 接收到 SIGHUP 信号将触发`fork/restart` 实现优雅重启(kill -1 pid会发送SIGHUP信号)// 接收到 syscall.SIGINT或syscall.SIGTERM 信号将触发优雅关机// 接收到 SIGUSR2 信号将触发HammerTime// SIGUSR1 和 SIGTSTP 被用来触发一些用户自定义的hook函数if err := endless.ListenAndServe(":8080", router); err!=nil{log.Fatalf("listen: %s", err)}log.Println("Server exiting")}复制代码

    如何验证优雅重启的效果呢?

    我们通过执行kill -1 pid命令发送syscall.SIGINT来通知程序优雅重启,具体做法如下:

    打开终端,go build -o graceful_restart编译并执行./graceful_restart,终端输出当前pid(假设为43682)将代码中处理请求函数返回的hello gin!修改为hello q1mi!,再次编译go build -o graceful_restart打开一个浏览器,访问127.0.0.1:8080/,此时浏览器白屏等待服务端返回响应。在终端迅速执行kill -1 43682命令给程序发送syscall.SIGHUP信号等第3步浏览器收到响应信息hello gin!后再次访问127.0.0.1:8080/会收到hello q1mi!的响应。在不影响当前未处理完请求的同时完成了程序代码的替换,实现了优雅重启。

    但是需要注意的是,此时程序的PID变化了,因为endless 是通过fork子进程处理新请求,待原进程处理完当前请求后再退出的方式实现优雅重启的。所以当你的项目是使用类似supervisor的软件管理进程时就不适用这种方式了。

    注意点开启go协程,需要错误不等于http.ErrServerClosed
    if err := rsv.ListenAndServe(); err != nil && err != http.ErrServerClosed {复制代码
    定义信号,阻塞
    // kill 默认会发送 syscall.SIGTERM 信号// kill -2 发送 syscall.SIGINT 信号,我们常用的Ctrl+C就是触发系统SIGINT信号// kill -9 发送 syscall.SIGKILL 信号,但是不能被捕获,所以不需要添加它// signal.Notify把收到的 syscall.SIGINT或syscall.SIGTERM 信号转发给quitsignal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)  // 此处不会阻塞<-quit  // 阻塞在此,当接收到上述两种信号时才会往下执行log.Println("Shutdown Server ...")复制代码
    总结

    无论是优雅关机还是优雅重启归根结底都是通过监听特定系统信号,然后执行一定的逻辑处理保障当前系统正在处理的请求被正常处理后再关闭当前进程。使用优雅关机还是使用优雅重启以及怎么实现,这就需要根据项目实际情况来决定了。

    一、Linux关机和重启命令及区别

    环境:RedHat
    linux
    Enterprise
    6+Virtual
    Box
    4.1linux关机和重启命令及区别关机命令:shutdown
    -h
    now(立刻进行关机)
    halt(立刻进行关机)重启命令:shutdown
    -r
    now(现在重新启动计算机)
    reboot(现在重新启动计算机)区别:shutdown
    -h
    now和shutdown
    -r
    now必须是root用户或者具有root权限的用户才能使用,而halt和reboot是linux系统中的任何用户都可使用,不需要root权限。作者
    Wentasy

    二、关机和重启在Linux Kernel中的哪些函数里实现

    关机和重启在Linux Kernel中的哪些函数里实现。

    reboot的最终实现在arch_reset()函数,它通常定义在arch/arm/mach-xxx/include/mach/system.h里。system.h被ARM kernel的public code应用,因此你需要定义这个头文件,并实现它。

    arch_reset的函数原型为

    void arch_reset(char mode)
    void arch_reset(char mode)

    关机需要将pm_power_off这个函数指针指向你自己的实现函数。函数指针是这样定义的

    void (*pm_power_off)(void);

    三、如何使用命令实现远程关机和重启

    首先打开运行窗口,出现DOS界面,然后敲入如下命令:
    shutdown
    /r
    /m\\hostname-t
    0其中,/r
    表示重新启动,/m表示机器主机名,-t表示延后时间(0表示立即重启)
    如果需要关机,则敲入如下命令:
    shutdown
    /s
    /m\\hostname-t
    0其中,/s
    表示关闭计算机
    如果你对命令行不太熟悉,可以直接敲入如下命令:
    shutdown
    /i
    打开对话框,然后输入相关参数即可
    远程关机或重启,需要有本地的管理员权限,要远程关闭计算机,请把相应的用户加入本地管理员,或者修改组策略添加用户权限。
    添加远程关机用户账户权限
    1.
    在组策略编辑器中,打开逐级展开“计算机配置”→“Windows
    设置”→“安全设置”→“本地策略”→“用户权利指派”
    2.
    在“组策略”窗口的右侧窗格中选择“从远端系统强制关机”,通过双击将其打开。
    3.
    单击对话框下方的“添加用户或组”按钮,添加一个可以远程关机的用户。

    关于win7设置定时关机命令的问题,通过《关机和重启在Linux Kernel中的哪些函数里实现》、《如何使用命令实现远程关机和重启》等文章的解答希望已经帮助到您了!如您想了解更多关于win7设置定时关机命令的相关信息,请到本站进行查找!

    爱资源吧版权声明:以上文中内容来自网络,如有侵权请联系删除,谢谢。

    win7设置定时关机命令
    免费PDF转Word!免费真香 模拟器如何换IP?