Microsoft MVP성태의 닷넷 이야기
오류 유형: 941. Golang - os.StartProcess() 사용 시 오류 정리 [링크 복사], [링크+제목 복사],
조회: 9057
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 76  [77]  78  79  80  81  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
12103정성태1/7/202027783DDK: 8. Visual Studio 2019 + WDK Legacy Driver 제작- Hello World 예제 [1]파일 다운로드2
12102정성태1/6/202022360디버깅 기술: 152. User 권한(Ring 3)의 프로그램에서 _ETHREAD 주소(및 커널 메모리를 읽을 수 있다면 _EPROCESS 주소) 구하는 방법
12101정성태1/5/202024704.NET Framework: 876. C# - PEB(Process Environment Block)를 통해 로드된 모듈 목록 열람
12100정성태1/3/202021527.NET Framework: 875. .NET 3.5 이하에서 IntPtr.Add 사용
12099정성태1/3/202024727디버깅 기술: 151. Windows 10 - Process Explorer로 확인한 Handle 정보를 windbg에서 조회 [1]
12098정성태1/2/202024577.NET Framework: 874. C# - 커널 구조체의 Offset 값을 하드 코딩하지 않고 사용하는 방법 [3]
12097정성태1/2/202021900디버깅 기술: 150. windbg - Wow64, x86, x64에서의 커널 구조체(예: TEB) 구조체 확인
12096정성태12/30/201923316디버깅 기술: 149. C# - DbgEng.dll을 이용한 간단한 디버거 제작 [1]
12095정성태12/27/201925871VC++: 135. C++ - string_view의 동작 방식
12094정성태12/26/201924985.NET Framework: 873. C# - 코드를 통해 PDB 심벌 파일 다운로드 방법
12093정성태12/26/201923569.NET Framework: 872. C# - 로딩된 Native DLL의 export 함수 목록 출력파일 다운로드1
12092정성태12/25/201921350디버깅 기술: 148. cdb.exe를 이용해 (ntdll.dll 등에 정의된) 커널 구조체 출력하는 방법
12091정성태12/25/201925334디버깅 기술: 147. pdb 파일을 다운로드하기 위한 symchk.exe 실행에 필요한 최소 파일 [1]
12090정성태12/24/201924707.NET Framework: 871. .NET AnyCPU로 빌드된 PE 헤더의 로딩 전/후 차이점 [1]파일 다운로드1
12089정성태12/23/201922005디버깅 기술: 146. gflags와 _CrtIsMemoryBlock을 이용한 Heap 메모리 손상 여부 체크
12088정성태12/23/201921911Linux: 28. Linux - 윈도우의 "Run as different user" 기능을 shell에서 실행하는 방법
12087정성태12/21/201922028디버깅 기술: 145. windbg/sos - Dictionary의 entries 배열 내용을 모두 덤프하는 방법 (do_hashtable.py) [1]
12086정성태12/20/201925640디버깅 기술: 144. windbg - Marshal.FreeHGlobal에서 발생한 덤프 분석 사례
12085정성태12/20/201923960오류 유형: 586. iisreset - The data is invalid. (2147942413, 8007000d) 오류 발생 - 두 번째 이야기 [1]
12084정성태12/19/201923593디버깅 기술: 143. windbg/sos - Hashtable의 buckets 배열 내용을 모두 덤프하는 방법 (do_hashtable.py) [1]
12083정성태12/17/201926032Linux: 27. linux - lldb를 이용한 .NET Core 응용 프로그램의 메모리 덤프 분석 방법 [2]
12082정성태12/17/201924560오류 유형: 585. lsof: WARNING: can't stat() fuse.gvfsd-fuse file system
12081정성태12/16/201927319개발 환경 구성: 465. 로컬 PC에서 개발 중인 ASP.NET Core 웹 응용 프로그램을 다른 PC에서도 접근하는 방법 [5]
12080정성태12/16/201923387.NET Framework: 870. C# - 프로세스의 모든 핸들을 열람
12079정성태12/13/201926042오류 유형: 584. 원격 데스크톱(rdp) 환경에서 다중 또는 고용량 파일 복사 시 "Unspecified error" 오류 발생
12078정성태12/13/201926239Linux: 26. .NET Core 응용 프로그램을 위한 메모리 덤프 방법 [3]
... 76  [77]  78  79  80  81  82  83  84  85  86  87  88  89  90  ...