Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package graceful
  5. import (
  6. "os"
  7. "os/signal"
  8. "syscall"
  9. "time"
  10. "code.gitea.io/gitea/modules/log"
  11. "code.gitea.io/gitea/modules/setting"
  12. )
  13. var hookableSignals []os.Signal
  14. func init() {
  15. hookableSignals = []os.Signal{
  16. syscall.SIGHUP,
  17. syscall.SIGUSR1,
  18. syscall.SIGUSR2,
  19. syscall.SIGINT,
  20. syscall.SIGTERM,
  21. syscall.SIGTSTP,
  22. }
  23. }
  24. // handleSignals listens for os Signals and calls any hooked in function that the
  25. // user had registered with the signal.
  26. func (srv *Server) handleSignals() {
  27. var sig os.Signal
  28. signal.Notify(
  29. srv.sigChan,
  30. hookableSignals...,
  31. )
  32. pid := syscall.Getpid()
  33. for {
  34. sig = <-srv.sigChan
  35. srv.preSignalHooks(sig)
  36. switch sig {
  37. case syscall.SIGHUP:
  38. if setting.GracefulRestartable {
  39. log.Info("PID: %d. Received SIGHUP. Forking...", pid)
  40. err := srv.fork()
  41. if err != nil {
  42. log.Error("Error whilst forking from PID: %d : %v", pid, err)
  43. }
  44. } else {
  45. log.Info("PID: %d. Received SIGHUP. Not set restartable. Shutting down...", pid)
  46. srv.shutdown()
  47. }
  48. case syscall.SIGUSR1:
  49. log.Info("PID %d. Received SIGUSR1.", pid)
  50. case syscall.SIGUSR2:
  51. log.Warn("PID %d. Received SIGUSR2. Hammering...", pid)
  52. srv.hammerTime(0 * time.Second)
  53. case syscall.SIGINT:
  54. log.Warn("PID %d. Received SIGINT. Shutting down...", pid)
  55. srv.shutdown()
  56. case syscall.SIGTERM:
  57. log.Warn("PID %d. Received SIGTERM. Shutting down...", pid)
  58. srv.shutdown()
  59. case syscall.SIGTSTP:
  60. log.Info("PID %d. Received SIGTSTP.")
  61. default:
  62. log.Info("PID %d. Received %v.", sig)
  63. }
  64. srv.postSignalHooks(sig)
  65. }
  66. }
  67. func (srv *Server) preSignalHooks(sig os.Signal) {
  68. if _, notSet := srv.PreSignalHooks[sig]; !notSet {
  69. return
  70. }
  71. for _, f := range srv.PreSignalHooks[sig] {
  72. f()
  73. }
  74. }
  75. func (srv *Server) postSignalHooks(sig os.Signal) {
  76. if _, notSet := srv.PostSignalHooks[sig]; !notSet {
  77. return
  78. }
  79. for _, f := range srv.PostSignalHooks[sig] {
  80. f()
  81. }
  82. }