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"
}

์„ค๋ช…

  • exists(name string) bool: ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • filePath(name string) string: ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • save(name string) error: ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค ID๋ฅผ ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  • deleteFile(name string) error: ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  • pid(name string) (int, error): ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ํŒŒ์ผ์—์„œ ํ”„๋กœ์„ธ์Šค ID๋ฅผ ์ฝ์–ด ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • isRunning(name string) bool: ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • processIsRunning(pid int) bool: ์ฃผ์–ด์ง„ ํ”„๋กœ์„ธ์Šค ID๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  • kill(name string) bool: ์ฃผ์–ด์ง„ ์ด๋ฆ„์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  • dataDir() string: ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. (์‹ค์ œ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ •)

4o

์ฝ”๋“œ ์„ค๋ช…

  1. ์ƒ์ˆ˜ ์ •์˜:

    • MASTER, CHAIN_MAKER, RESOURCE_MINER, COLLECTOR, PEER_SEARCHER, DATA_POOL๋Š” ํ”„๋กœ์„ธ์Šค ์ด๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ƒ์ˆ˜์ž…๋‹ˆ๋‹ค.

  2. exists ํ•จ์ˆ˜:

    • ์ฃผ์–ด์ง„ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” PID ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  3. filePath ํ•จ์ˆ˜:

    • ์ฃผ์–ด์ง„ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” PID ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  4. save ํ•จ์ˆ˜:

    • ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ PID๋ฅผ ์ฃผ์–ด์ง„ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” PID ํŒŒ์ผ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

  5. deleteFile ํ•จ์ˆ˜:

    • ์ฃผ์–ด์ง„ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” PID ํŒŒ์ผ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

  6. pid ํ•จ์ˆ˜:

    • ์ฃผ์–ด์ง„ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” PID ํŒŒ์ผ์—์„œ PID๋ฅผ ์ฝ์–ด ์ •์ˆ˜๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  7. isRunning ํ•จ์ˆ˜:

    • ์ฃผ์–ด์ง„ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” PID ํŒŒ์ผ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  8. processIsRunning ํ•จ์ˆ˜:

    • ์ฃผ์–ด์ง„ PID์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  9. kill ํ•จ์ˆ˜:

    • ์ฃผ์–ด์ง„ ์ด๋ฆ„์— ํ•ด๋‹นํ•˜๋Š” PID ํŒŒ์ผ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

  10. dataDir ํ•จ์ˆ˜:

    • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋””๋ ‰ํ† ๋ฆฌ์˜ ๊ฒฝ๋กœ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Last updated