install systemd service
(systemd, exePath string, args []string)
| 112 | |
| 113 | // install systemd service |
| 114 | func (this *ServiceManager) installSystemdService(systemd, exePath string, args []string) error { |
| 115 | var shortName = teaconst.SystemdServiceName |
| 116 | var longName = "GoEdge Node" // TODO 将来可以修改 |
| 117 | |
| 118 | var startCmd = exePath + " daemon" |
| 119 | bashPath, _ := executils.LookPath("bash") |
| 120 | if len(bashPath) > 0 { |
| 121 | startCmd = bashPath + " -c \"" + startCmd + "\"" |
| 122 | } |
| 123 | |
| 124 | var desc = `### BEGIN INIT INFO |
| 125 | # Provides: ` + shortName + ` |
| 126 | # Required-Start: $all |
| 127 | # Required-Stop: |
| 128 | # Default-Start: 2 3 4 5 |
| 129 | # Default-Stop: |
| 130 | # Short-Description: ` + longName + ` Service |
| 131 | ### END INIT INFO |
| 132 | |
| 133 | [Unit] |
| 134 | Description=` + longName + ` Service |
| 135 | Before=shutdown.target |
| 136 | After=network-online.target |
| 137 | |
| 138 | [Service] |
| 139 | Type=simple |
| 140 | Restart=always |
| 141 | RestartSec=1s |
| 142 | ExecStart=` + startCmd + ` |
| 143 | ExecStop=` + exePath + ` stop |
| 144 | ExecReload=` + exePath + ` reload |
| 145 | |
| 146 | [Install] |
| 147 | WantedBy=multi-user.target` |
| 148 | |
| 149 | // write file |
| 150 | err := os.WriteFile(systemdServiceFile, []byte(desc), 0777) |
| 151 | if err != nil { |
| 152 | return err |
| 153 | } |
| 154 | |
| 155 | // stop current systemd service if running |
| 156 | _ = executils.NewTimeoutCmd(10*time.Second, systemd, "stop", shortName+".service").Start() |
| 157 | |
| 158 | // reload |
| 159 | _ = executils.NewTimeoutCmd(10*time.Second, systemd, "daemon-reload").Start() |
| 160 | |
| 161 | // enable |
| 162 | var cmd = executils.NewTimeoutCmd(10*time.Second, systemd, "enable", shortName+".service") |
| 163 | cmd.WithStderr() |
| 164 | err = cmd.Run() |
| 165 | if err != nil { |
| 166 | return fmt.Errorf("%w: %s", err, cmd.Stderr()) |
| 167 | } |
| 168 | return nil |
| 169 | } |