ホームページ > バックエンド開発 > Golang > golang 他のプログラムを閉じます

golang 他のプログラムを閉じます

王林
リリース: 2023-05-13 12:34:38
オリジナル
1017 人が閲覧しました

最近、golang を学習しているときに、次の要件に遭遇しました。プログラムの実行中、プログラムの正確な実行を保証するために、システム内で指定された他のプログラムを閉じる必要があります。この要件を達成するために、私はいくつかの調査を行った結果、次の方法を提供しました。

方法 1: exec.Command

golang には exec パッケージがあり、これを通じて外部コマンドを実行できます。つまり、他のプログラムも golang プログラムを通じて実行できます。この機能に基づいて、exec.Command メソッドを使用して、他の指定されたプログラムを閉じることができます。

コード例:

cmd := exec.Command("taskkill", "/F", "/IM", "notepad.exe")
err := cmd.Run()
if err != nil {
    fmt.Println("execute command failed: ", err)
}
ログイン後にコピー

上記のコードは、Windows システムで exec.Command メソッドを通じて taskkill コマンドを実行し、notepad.exe プログラムを閉じます。このうち、/F はプロセスの強制終了を意味し、/IM の後にプロセス名が続きます。

次に、コードに基づいて exec.Command の実行メソッドを分析します。

  1. まず、exec.Cmd 構造体オブジェクト cmd を作成します。
  2. 実行するコマンドとパラメータ(タスクマネージャーのPIDまたはプロセスイメージ名)を設定します。
  3. cmd.Run() メソッドを呼び出してコマンドを実行します。
  4. cmd.Run() によって返されたエラー err を処理します。err が nil でない場合は、コマンドの実行が失敗したことを意味します。

方法 2: syscall.Kill

exec パッケージを使用して外部コマンドを実行してプロセスをシャットダウンすることに加えて、golang はネイティブ メソッド syscall.Kill も提供します。この関数は、指定されたプロセスの PID を直接強制終了できます。

コード例:

pid := 123 // 进程的PID
err := syscall.Kill(pid, syscall.SIGKILL) // 执行kill命令
if err != nil {
    fmt.Println("kill process failed: ", err)
}
ログイン後にコピー

上記のコードは、syscall.Kill 関数を使用して、指定された PID プロセスをシャットダウンします。 SIGKILL は Linux システムの kill コマンドで、プロセスを直接強制終了できます。これはプロセスを強制的に終了するのと同じです。

次に、コードに基づいて syscall.Kill の実行メソッドを分析します。

  1. 管理者権限でプログラムを実行する必要があります。そうでない場合、指定されたプロセスは強制終了されません。許可がないからです。
  2. プロセスの PID を保存する変数 pid を作成します。
  3. syscall.Kill(pid, SIGKILL) を呼び出してプロセスを強制終了します。
  4. syscall.Kill によって返されたエラー err を処理します。err が nil でない場合、コマンドの実行が失敗したことを意味します。

方法 3: サードパーティ ライブラリを使用する

上記 2 つの方法に加えて、サードパーティ ライブラリを使用して、他のプログラムを閉じる機能を実現することもできます。最も一般的に使用されるライブラリは github.com/mitchellh/go-ps ライブラリで、現在システムで実行されているすべてのプロセスに関する情報を返すことができます。

指定された名前のプロセスを見つけて、プロセス情報に基づいて強制終了します。

コード例:

processes, err := ps.Processes()
if err != nil {
    fmt.Println("get processes failed: ", err)
    return
}
for _, p := range processes {
    if strings.Contains(p.Executable(), "notepad") {
        err := syscall.Kill(p.Pid(), syscall.SIGTERM)
        if err != nil {
            fmt.Println("kill process failed: ", err)
        }
    }
}
ログイン後にコピー

上記のコードは、サードパーティ ライブラリ github.com/mitchellh/go-ps を通じてシステム内のすべてのプロセス情報を取得し、これらのプロセスを走査して名前を検索します。メモ帳プロセスを含むので、それを強制終了します。

次に、コードに基づいて go-ps ライブラリの使用方法を分析しましょう:

  1. github.com/mitchellh/go-ps ライブラリを紹介します。
  2. ps.Processes() メソッドを呼び出して、システム内のすべてのプロセス情報を取得します。
  3. プロセス情報を調べて、指定された名前のプロセスを見つけます。
  4. syscall.Kill(p.Pid(), SIGTERM) メソッドを呼び出してプロセスを強制終了します。
  5. syscall.Kill によって返されたエラー err を処理します。err が nil でない場合、コマンドの実行が失敗したことを意味します。

上記の 3 つのメソッドのうち、exec.Command と syscall.Kill はネイティブの golang メソッドであり、比較的簡単に使用できます。サードパーティライブラリを利用する方法では、外部ライブラリの導入が必要になりますが、プロセスの起動時間など、より豊富な情報を取得できます。

概要

上記の 3 つの方法により、golang プログラムが他のプログラムを閉じる機能を実現できます。プログラムの動作の正確性を保証する必要がある場合、この方法でシステム内の不要なプロセスを強制終了して、プログラムの安定性を確保できます。これらの方法を使用するときは、他のプロセスを誤って削除しないように、プロセスの PID と名前に特に注意してください。

以上がgolang 他のプログラムを閉じますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート