김수준
1k
2020-12-10 23:39:41
4
559

리눅스 환경에서 Golang 프로세스를 실행하는 방법에 대해 조사하고 있는데요.. 지금까지 정리한 부분이 맞는지 확인해주세요.


실행하는 파일이 main.go일 경우 main.go가 있는 디렉토리로 이동한 뒤

Go run main.go 를 사용하여 실행한다.

하지만 이렇게하면 터미널 세션이 끊겼을 때 실행이 멈추기 때문에 터미널 세션이 끊겨도 실행을 멈추지 않고 동작하도록 하는 nohup이라는 쉘스크립트파일(*.sh)을 데몬형태로 실행시키는 프로그램을 사용하면 된다. 여기서 데몬은 서비스의 요청에 대해 응답하는 오랫동안 실행중인 백그라운드 프로세스임.

사용자에게 무언가를 키보드를 통해 전달받지 않고 스스로 동작하는 프로세스를 백그라운드 프로세스라고 하는데 리눅스 운영체제에서 이름이 "d"로 끝나는 프로세스들이 대표적인데 inetd, httpd,등이 있음.


그래서 nohup이라는 것을 사용하기 위해 go build를 사용하면 *.sh형태의 파일이 생성되며

이 .sh형태의 파일에게 chmod+x 으로 실행권한을 주고,  nohup 쉘스크립트파일명 & 명령으로 데몬형식으로 실행시켜준다.


여기서 틀린점이나 보충할 만한 내용 있으면 알려주시면 감사합니다.

0
  • 댓글 4

  • JohnMark
    531
    2020-12-11 00:28:16

    *.sh로 끝나는 파일은 쉘 스크립트 파일입니다. go build 해서 나온 빌드 결과물은 *.sh 과 같이 sh 확장자가 붙지 않습니다. 바이너리 파일이기 때문입니다. 

    nohup은 표준출력을 다른곳으로 바꾸거나, 특정 명령어 또는 실행파일 또는 스크립트를 백그라운드로 진행할 수 있도록 하는 리눅스 명령어입니다. *.sh 쉘스크립트만 종속된게 아니에요.

    go build를 실제로 해보시는것도 좋을 것 같습니다. go 빌드 결과물을 백그라운드로 실행시키고 싶으시다면, nohup도 좋지만 서버라면, systemd에 등록시켜 데몬 서비스로 돌리는것이 더 좋습니다.

    https://hamait.tistory.com/931 

  • 멘탈조각
    1k
    2020-12-11 08:23:48

    nohup은 관리가 되지 않기 때문에 사용을 추천하지 않습니다.

    윗분 말씀대로 systemd나 initd에 등록해서 서비스로 데모나이즈 하는게 좋습니다.

  • 김수준
    1k
    2020-12-11 09:34:34

    JohnMark

    답변 감사합니다. 그러면 *.sh형태는 

    $vi 파일명.sh 명령어로 새로 만들어 주어야 하나요?

  • 김수준
    1k
    2020-12-11 09:52:54 작성 2020-12-11 10:09:31 수정됨

    실행하는 파일이 main.go일 경우 main.go가 있는 디렉토리로 이동한 뒤 Go run main.go 를 사용하여 실행한다. 

    하지만 이런식의 포그라운드 형태로 실행 하면 터미널 세션이 끊겼을 때 실행이 멈추기 때문에 터미널 세션이 끊겨도 실행을 멈추지 않고 동작하도록 하는 nohup이라는 명형어를 사용하면 되는데 nohup은 표준출력을 다른곳으로 바꾸거나, 특정 명령어 또는 실행파일 또는 스크립트를 백그라운드로 진행할 수 있도록 하는 리눅스 명령어를 사용하면 된다. 보통 출력은 .out, 에러출력은 .err파일에 저장이 된다.

    여기서 데몬은 서비스의 요청에 대해 응답하는 오랫동안 실행중인 백그라운드 프로세스임. 

    사용자에게 무언가를 키보드를 통해 전달받지 않고 스스로 동작하는 프로세스를 백그라운드 프로세스라고 하는데 리눅스 운영체제에서 이름이 "d"로 끝나는 프로세스들이 대표적인데 inetd, httpd,systemd등이 있음. 

    nohup 실행파일 & 명령으로 데몬형식으로 실행시켜준다.


    이렇게 수정했는데 설명하기 괜찮을까요?

  • 로그인을 하시면 댓글을 등록할 수 있습니다.