10

以下は (当然のことながら) 機能しません。

package main

import (
        "os"
        "time"
)

func main() {
        os.Args[0] = "custom name"
        println("sleeping")
        time.Sleep(1000 * time.Second)
        println("done")
}

一部の言語では、プロセス名を設定するこの機能を組み込み機能 (たとえば、Ruby では に割り当てる $0だけの問題) またはサードパーティ ライブラリ ( Python ) として提供しています。

少なくとも Linux で動作するソリューションを探しています。

4

3 に答える 3

13

これを実現するには複数の方法があり、その多くは特定の状況でのみ機能します。(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 に特有のものかもしれません。

于 2013-02-18T18:39:50.037 に答える
4

Linux でプロセス名を変更するには、オプションと組み合わせてprctl システム コールを使用する必要がありPR_SET_NAMEます。

現時点では、Go コードでこれを行うことはできないと思います。ただし、小さな C モジュールをビルドしてこれを行い、それを Go ビルドに統合することはできます。

于 2013-02-17T21:34:37.160 に答える
0

「プロセスタイトル」は明確に定義された用語ではないと思います。とにかく、Ruby は Go と何の関係があるのでしょうか? os.Argsのドキュメントには、「プロセス タイトル」については言及されておらず、スライス アイテムへの割り当て時に魔法が発生するとも記載されていません。後者は実際には Go の一般的なプロパティです。構造体フィールド、配列/スライス項目の変数のための魔法のゲッター/セッターはありません。そのため、単純な代入は単純に代入し、それ以上何もせず、それ以上何もできません。

要するに、魔法の欠如は、期待される正しい動作です。

「os」パッケージを介して移植可能にアクセスできるもの以外のプロセス プロパティをいじるには、プラットフォーム固有の方法でパッケージ「syscall」を使用する必要があります。ただし、ビルドの制約 (ここで説明) は、プラットフォーム間で適切に処理するのに役立ちます。

于 2013-02-17T21:21:42.780 に答える