[golang] 파일 잠금으로 프로그램 중복 실행 방지하기

2024. 11. 12. 21:40·Language/Go

서론

무려 Go언어에서 개발할 수 있는 GUI 프로그램에서는 중복 실행을 방지해야 하는 경우가 있다. 서버 프로그램은 특정 포트에 바인딩을 하므로, 이미 해당 포트가 사용 중이라면 두 번째 프로세스는 바인딩에 실패하며 중복 실행이 자연스럽게 방지된다. 하지만 일반 프로그램의 경우에는 포트 바인딩과 같은 방법을 사용할 수 없기 때문에, 별도로 중복 실행을 막기 위한 방법이 필요하다. 이를 해결하기 위해 Go 언어에서 파일 잠금을 이용하여 중복 실행을 방지하는 방법을 활용할 수 있다.

 

예제

package main

import (
	"bufio"
	"fmt"
	"os"
	"syscall"
)

func main() {
	file, err := os.OpenFile("myapp.lock", os.O_CREATE|os.O_RDWR, 0644)
	if err != nil {
		fmt.Println("Failed to open lock file:", err)
		return
	}
	defer file.Close()

	err = syscall.Flock(int(file.Fd()), syscall.LOCK_EX|syscall.LOCK_NB)
	if err != nil {
		fmt.Println("❌")
		return
	}
	defer syscall.Flock(int(file.Fd()), syscall.LOCK_UN)

	fmt.Println("⏰")
	bufio.NewReader(os.Stdin).ReadRune()
}

 

파일 잠금으로 하나의 프로세스만 실행되도록 제어할 수 있다. 이미 다른 프로세스가 실행 중이면 두 번째 프로세스는 파일 잠금을 얻지 못하고 종료된다. 단, 이 방법은 macOS, Linux 같은 Unix 계열 시스템에서는 잘 동작하지만 Windows에서는 syscall.Flock을 지원하지 않기 때문에 다른 방식으로 처리해야 한다.

'Language > Go' 카테고리의 다른 글

[golang] 텍스트 이미지 생성 및 JPEG 인코딩  (0) 2024.11.14
[golang] GOMAXPROCS로 최대 CPU 코어 수 제한하기  (0) 2024.11.13
[golang] 현재 운영 체제 확인하기  (0) 2024.11.11
[golang] iota 키워드로 열거형 상수 정의  (4) 2024.11.10
[golang] sync.WaitGroup으로 고루틴 작업 기다리기  (0) 2024.11.09
'Language/Go' 카테고리의 다른 글
  • [golang] 텍스트 이미지 생성 및 JPEG 인코딩
  • [golang] GOMAXPROCS로 최대 CPU 코어 수 제한하기
  • [golang] 현재 운영 체제 확인하기
  • [golang] iota 키워드로 열거형 상수 정의
在晟
在晟
  • 在晟
    Jae-Sung
    在晟
  • 전체
    오늘
    어제
    • 분류 전체보기 (25)
      • Language (23)
        • Go (23)
      • DBMS (1)
        • MariaDB (1)
      • Notes (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Jae-Sung
    • GitHub
  • 인기 글

  • 태그

    fasthttp
    interface{}
    recover
    go
    filepath
    http
    오블완
    unsafe
    Runtime
    티스토리챌린지
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
在晟
[golang] 파일 잠금으로 프로그램 중복 실행 방지하기
상단으로

티스토리툴바