これを実現するには複数の方法があり、その多くは特定の状況でのみ機能します。(1 つには) プロセスがさまざまな状況でさまざまな名前で表示される可能性があるため、これを行うことはあまりお勧めしません。syscall や unsafe を使用する必要があるため、Go 言語の安全性を故意に覆しています。ただし、オプションは次のようです。
argv[0] を変更
func SetProcessName(name string) error {
argv0str := (*reflect.StringHeader)(unsafe.Pointer(&os.Args[0]))
argv0 := (*[1 << 30]byte)(unsafe.Pointer(argv0str.Data))[:argv0str.Len]
n := copy(argv0, name)
if n < len(argv0) {
argv0[n] = 0
}
return nil
}
Go では、(内部ランタイム関数を呼び出さずに) 実際の argv 配列自体にアクセスできないため、現在のプロセス名の長さを超えない新しい名前に制限されます。
これは、ほとんどの場合、Darwin と Linux の両方で機能するようです。
PR_SET_NAME に発信
func SetProcessName(name string) error {
bytes := append([]byte(name), 0)
ptr := unsafe.Pointer(&bytes[0])
if _, _, errno := syscall.RawSyscall6(syscall.SYS_PRCTL, syscall.PR_SET_NAME, uintptr(ptr), 0, 0, 0, 0); errno != 0 {
return syscall.Errno(errno)
}
return nil
}
新しい名前は最大 16 バイトです。
これは Darwin では機能せず、Linux でもあまり機能しないように見えますが、成功し、後で PR_GET_NAME が正しい名前を報告します。ただし、これは私の Linux VM に特有のものかもしれません。