godoos/godo/progress/stop.go
2024-07-25 08:20:02 +08:00

87 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package progress
import (
"fmt"
"net/http"
"os"
"github.com/gorilla/mux"
)
func StopProcess(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
name := vars["name"]
cmd, ok := processes[name]
if !ok {
respondWithError(w, http.StatusNotFound, "Process not found")
return
}
// 停止进程并更新status
if err := cmd.Cmd.Process.Kill(); err != nil {
respondWithError(w, http.StatusInternalServerError, err.Error())
return
}
//delete(processes, name) // 更新status表示进程已停止
cmd.Running = false
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "Process %s stopped.", name)
}
func StopAllHandler() error {
processesMu.Lock()
defer processesMu.Unlock()
for name, cmd := range processes {
if err := cmd.Cmd.Process.Signal(os.Interrupt); err != nil {
return fmt.Errorf("Failed to stop process %s: %v", name, err)
}
}
return nil
}
func StopAll(w http.ResponseWriter, r *http.Request) {
err := StopAllHandler()
if err != nil {
respondWithError(w, http.StatusInternalServerError, err.Error())
return
}
// processesMu.Lock()
// defer processesMu.Unlock()
// for name, cmd := range processes {
// if err := cmd.Cmd.Process.Signal(os.Interrupt); err != nil {
// respondWithError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop process %s: %v", name, err))
// return
// }
// }
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "All processes stopped.")
}
// Restart a specific process by stopping and then starting it.
func ReStartProcess(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
name := vars["name"]
// Stop the process first
if cmd, ok := processes[name]; ok {
if err := cmd.Cmd.Process.Kill(); err != nil {
respondWithError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to stop process %s before restart: %v", name, err))
return
}
//delete(processes, name)
cmd.Running = false
} else {
respondWithError(w, http.StatusNotFound, fmt.Sprintf("Process %s not found to restart", name))
return
}
// Start the process again
err := ExecuteScript(name)
if err != nil {
respondWithError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to restart process %s: %v", name, err))
return
}
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, "Process %s restarted.", name)
}