Microsoft MVP성태의 닷넷 이야기
오류 유형: 941. Golang - os.StartProcess() 사용 시 오류 정리 [링크 복사], [링크+제목 복사],
조회: 4583
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

Golang - os.StartProcess() 사용 시 오류 정리

살을 붙여 가면서 설명해 보겠습니다. ^^

// 명령행에서 "c:\temp> sc delete test_app"이라고 실행하는 것을 go 언어로 실행

package main

import (
	"log"
	"os"
)

func main() {
	exePath := "sc"
	args := []string{"delete", "test_app"}

	p, err := os.StartProcess(exePath, args, &os.ProcAttr{})
	if err == nil {
		status, err := p.Wait()
		if err == nil {
			log.Printf("errorlevel: %v", status.ExitCode())
		}
	}

	if err != nil {
		log.Println(err)
	}
}

우선, 위와 같은 식으로 프로그램을 실행하면 이런 오류가 발생합니다.

fork/exec sc: invalid argument

왜냐하면, os.ProcAttr 구조체에는 3개의 표준 I/O, Error 스트림을 지정해야 하기 때문입니다. 그래서 이렇게 지정하면,

var procAttr os.ProcAttr
procAttr.Files = []*os.File{os.Stdin, os.Stdout, os.Stderr}

exePath := "sc"
args := []string{"delete", "test_app"}

p, err := os.StartProcess(exePath, args, &procAttr)

이제는 이런 오류가 발생합니다.

fork/exec sc: The system cannot find the file specified.

오류 메시지에도 나오지만, 비록 윈도우 명령행에서 어디서든지 실행할 수 있는 sc.exe 실행 파일을 지정했어도 os.StartProcess의 인자에는 정확한 경로를 지정해야 합니다. 따라서 다음과 같이 설정해야 합니다.

exePath := "c:\\windows\\system32\\sc.exe"

// 또는,
// exePath, err := exec.LookPath("sc")

하지만, 그래도 이런 오류가 발생합니다. ^^

ERROR:  Unrecognized command
...[생략: sc.exe 실행 결과]...
errorlevel: 1639

실행 결과를 보면, sc.exe 실행 파일 자체는 정상적으로 구동이 된 것을 볼 수 있지만 이제는 명령어에 전달한 옵션이 잘못되었기 때문에 나온 현상입니다. 윈도우 개발자들이 흔히 할 수 있는 실수인데요, *NIX 관행에서는 인자에 실행 파일까지 전달하는 관습(?)이 있어서 옵션에도 다음과 같이 전달해야 합니다.

args := []string{"sc", "delete", "test_app"}
// 또는,
// args := []string{exePath, "delete", "test_app"}

끝입니다. ^^ 저렇게까지 해야 이제 정상적으로 실행됩니다.




그나마 다행인 것은, 전달한 인자에 공백이 있어도 이것을 하나로 인식해 처리해 준다는 점입니다. 그래서 다음과 같이 프로그램 경로와 그 인자에 공백이 있어도,

exePath := "C:\\Program Files\\dotnet\\dotnet.exe"
args := []string{exePath, "C:\\temp\\Console App1\\ConsoleApp1\\bin\\Debug\\net8.0\\ConsoleApp1.dll"}

실행에 문제가 없습니다. ^^




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 12/28/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 181  182  183  184  185  186  187  188  189  [190]  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
199정성태4/13/200619396스크립트: 6. XHTML or HTML 4.01 표준 준수
194정성태4/13/200618633VC++: 22. IDL Library 절
193정성태4/13/200619117.NET Framework: 57. IComponentChangeService 인터페이스
192정성태6/1/200616392VC++: 21. Visual C++ struct와 class의 차이점
189정성태4/13/200624094VC++: 20. ActiveX CAB 파일 오류 유형 - 파일을 대상 디렉터리로 복사할 수 없음. [6]
187정성태11/24/200518371VS.NET IDE: 35. VS.NET 2005 IDE Tip - 2번째 : XML / XSL 지원 강화
186정성태11/23/200515895.NET Framework: 56. VS.NET 2005 IDE Tip
182정성태11/21/200516084.NET Framework: 55. 에러가 발생할 것만 같은 코드
181정성태11/20/200544867.NET Framework: 54. 한글이 포함된 ANSI, UTF-8, UNICODE 텍스트 파일 읽기 [3]파일 다운로드1
197정성태12/25/200520334    답변글 .NET Framework: 54.4. [관련 문제] A 태그의 href에서의 문제.
198정성태12/27/200518084    답변글 .NET Framework: 54.5. [추가]: VS.NET으로 UTF-8 홈페이지 구성하기
179정성태11/8/200515745.NET Framework: 53. .NET Remoting: 메시지 교체
178정성태11/5/200516648기타: 11. Dual Core 장만. ^^
177정성태11/2/200516365COM 개체 관련: 17. CoGetClassObjectFromURL파일 다운로드1
176정성태3/29/200621588.NET Framework: 52. covariance? [1]파일 다운로드1
175정성태10/31/200517179.NET Framework: 51. MSXML 6.0에서 디지털 서명 기능을 제거!
180정성태11/15/200517313    답변글 VS.NET IDE: 51.1. MSXML 6.0 정식 릴리스
174정성태10/31/200518101.NET Framework: 50. app.config 예시 [1]
173정성태10/30/200516909스크립트: 5. 스크립트 호출 관계
172정성태10/25/200525237.NET Framework: 49. ASP.NET 오류 유형 : 액세스가 거부되었습니다. [2]
171정성태11/14/200527076VC++: 19. 다국어 지원: setlocale( LC_TIME, "" ) 관련 [1]
170정성태11/14/200521717VS.NET IDE: 34. Visual SourceSafe 2005: Remote Internet Access over HTTP : 80 이외의 포트를 지정
206정성태2/1/200618003    답변글 VC++: 34.1. [추가]: Internet Access Plug-in 사용 시 유의 사항
168정성태11/14/200519032VS.NET IDE: 33. IIS 6.0 AppPool 설정 - Enable rapid-fail protection
169정성태10/14/200520716    답변글 VS.NET IDE: 33.1. Enable rapid-fail protection 상황 재현 방법
166정성태11/14/200517974.NET Framework: 48. IE를 죽이는 스크립트 소스
... 181  182  183  184  185  186  187  188  189  [190]  191  192  193  194  195  ...