2015-01-07 6 views
3

사용자에게 배포하는 Go 바이너리를 업데이트하기 위해 go-update (https://github.com/inconshreveable/go-update)를 사용하고 있습니다. 현재 실행중인 go 프로그램이 새 버전을 감지하면 사용자에게 프로그램을 종료하고 다시 시작하라는 메시지를 보냅니다.go 바이너리가 스스로 다시로드 할 수 있습니까?

실행중인 go 프로그램이 새 바이너리에서 자체를 다시로드 할 수 있습니까?

는 이동 업데이트 이슈 트래커에 요청했지만, 아무 대답 : https://github.com/inconshreveable/go-update/issues/5

답변

7

예, 현재 프로세스의 실행 파일 이름을 보유 os.Args하고 시작할 수 os.exec 패키지를 사용 할 수 없습니다 포크 프로세스. 좋은 예는 중단 시간 재시작을 전혀 지원하지 않는 goagain 패키지에서 수행되는 방법입니다. 실제로, 당신은 아마 그것을 사용할 수 있습니다.

는이 파일에 https://github.com/rcrowley/goagain

보다 구체적를 참조하십시오

+3

https://github.com/rcrowley/goagain/blob/master/goagain.go#L77이 응용 프로그램을 실행 한 프로그램에 의해 os.Args''가짜 실행 파일 이름에 쉽게 가능 실현 마십시오. 이 문제는 * per-se *는 아니지만 높은 권한으로 응용 프로그램을 실행하는 경우 보안 문제가 발생할 수 있습니다. – fuz

+0

@FUZxxl 미리 구운 방법은 모르지만'os.GetPid()'를 사용하여 현재 프로세스 ID를 얻은 다음'/ proc/에있는 실행 파일 경로를 찾아 볼 수 있습니다/exe'. 그리고 나서 이것이 실제로 현재 실행 파일인지 확인할 수 있습니다. –

+1

글쎄, 당신이 리눅스에 묶고 싶다면 ...이 방법은 실제로 이식성이 없다. 대부분의 운영 체제는 실행중인 프로세스의 바이너리 이름이 무엇인지 파악할 수있는 방법을 제공하지만이를 수행하는 방법은 각각 다릅니다. – fuz

관련 문제