ProcessManager.go
package staff
import (
"fmt"
"io/ioutil"
"os"
"strconv"
"strings"
"syscall"
"time"
)
// ํ๋ก์ธ์ค ์ด๋ฆ ์์ ์ ์
const (
MASTER = "master"
CHAIN_MAKER = "maker"
RESOURCE_MINER = "miner"
COLLECTOR = "collector"
PEER_SEARCHER = "peer_searcher"
DATA_POOL = "data_pool"
)
// exists ํจ์๋ ์ฃผ์ด์ง ์ด๋ฆ์ ํ์ผ์ด ์กด์ฌํ๋์ง ํ์ธํฉ๋๋ค.
func exists(name string) bool {
file := filePath(name)
_, err := os.Stat(file)
return !os.IsNotExist(err)
}
// filePath ํจ์๋ ์ฃผ์ด์ง ์ด๋ฆ์ ํ์ผ ๊ฒฝ๋ก๋ฅผ ๋ฐํํฉ๋๋ค.
func filePath(name string) string {
return fmt.Sprintf("%s/%s.pid", dataDir(), name)
}
// save ํจ์๋ ํ์ฌ ํ๋ก์ธ์ค ID๋ฅผ ํ์ผ์ ์ ์ฅํฉ๋๋ค.
func save(name string) error {
file := filePath(name)
pid := strconv.Itoa(os.Getpid())
return ioutil.WriteFile(file, []byte(pid), 0644)
}
// deleteFile ํจ์๋ ์ฃผ์ด์ง ์ด๋ฆ์ ํ์ผ์ ์ญ์ ํฉ๋๋ค.
func deleteFile(name string) error {
file := filePath(name)
return os.Remove(file)
}
// pid ํจ์๋ ์ฃผ์ด์ง ์ด๋ฆ์ ํ์ผ์์ ํ๋ก์ธ์ค ID๋ฅผ ์ฝ์ด ๋ฐํํฉ๋๋ค.
func pid(name string) (int, error) {
file := filePath(name)
data, err := ioutil.ReadFile(file)
if err != nil {
return -1, err
}
return strconv.Atoi(strings.TrimSpace(string(data)))
}
// isRunning ํจ์๋ ์ฃผ์ด์ง ์ด๋ฆ์ ํ๋ก์ธ์ค๊ฐ ์คํ ์ค์ธ์ง ํ์ธํฉ๋๋ค.
func isRunning(name string) bool {
pid, err := pid(name)
if err != nil || pid <= 0 {
return false
}
return processIsRunning(pid)
}
// processIsRunning ํจ์๋ ์ฃผ์ด์ง ํ๋ก์ธ์ค ID๊ฐ ์คํ ์ค์ธ์ง ํ์ธํฉ๋๋ค.
func processIsRunning(pid int) bool {
process, err := os.FindProcess(pid)
if err != nil {
return false
}
err = process.Signal(syscall.Signal(0))
if err == nil {
return true
}
if err == syscall.ESRCH {
return false
}
return true
}
// kill ํจ์๋ ์ฃผ์ด์ง ์ด๋ฆ์ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํฉ๋๋ค.
func kill(name string) bool {
if !isRunning(name) {
return false
}
pid, err := pid(name)
if err != nil {
return false
}
deleteFile(name)
process, err := os.FindProcess(pid)
if err != nil {
return false
}
err = process.Signal(syscall.SIGTERM)
if err != nil {
return false
}
for processIsRunning(pid) {
time.Sleep(100 * time.Millisecond)
}
return true
}
// dataDir ํจ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ฐํํฉ๋๋ค. ์ค์ ํ๊ฒฝ์ ๋ง๊ฒ ์์ ํ์ธ์.
func dataDir() string {
return "/path/to/data"
}์ค๋ช
์ฝ๋ ์ค๋ช
Last updated