2

コマンドラインからプログラムの複数のコピーを実行したいテスト プログラムがあり、開始するプログラムの最初のインスタンスを知る必要があります。Dart では、誰かが私に提案した次のことを行います。

RawServerSocket.bind("127.0.0.1", 8087)

それが失敗した場合、別のプログラムがポートを「ロック」したことがわかります。それは私にとって十分に問題を解決します。プログラムが終了するか、ソケットが明示的に閉じられると、ロックは解放されます。

Goで同様の結果を得るにはどうすればよいですか?

4

3 に答える 3

3

「UNIX の方法」は、/var/run/< name >.pid 内に pid ファイルを作成することです.go#L91 ファイルが存在する場合は、プログラムが既に開始されていることを意味します。

bind メソッドを使用することはお勧めしません。何もポートをロックしないため、他のプログラムがポートを使用していないことを確認できません。

于 2013-09-24T17:26:19.423 に答える
2

フラグで使用os.OpenFile()するのはどうですか?os.CREATE | os.O_EXCL

file, err := os.OpenFile("lock", os.O_CREATE | os.O_EXCL | os.O_RDWR, 0400)
if err != nil {
        // Someone else has acquired the lock.
}
defer file.Close()
defer os.Remove("lock") // Ignoring errors here!

私はこれをコンパイルしたりテストしたりしていませんが、動作するはずであり、いずれにせよ、あなたはアイデアを得る...

于 2013-09-24T20:57:01.550 に答える