プログラムがすでに実行されており、特定のファイルが開いている場合にプログラムが起動しないようにする

プログラムがすでに実行されており、特定のファイルが開いている場合にプログラムが起動しないようにする

a_command myfileペアを1つのインスタンスのみに制限する必要があります。

  • 私の特別なケースでは
    qemu-system-x86_64 [options] -drive file=myfile.img,format=raw
    
  • スクリプトは両方ともqemu-system-x86_64実行中であることを確認する必要があります。そしてファイルがmyfile.img開いています。myfile.imgrw-openなら、どのプログラムも実行されないようにする方が安全です。

どうすればいいですか?

ベストアンサー1

Stephen Kittは、コメントではこれが最初に不要になる可能性があると指摘していますが、とを組み合わせて特定のバイナリがpidof実行されていること、および特定のファイルが開いていることを確認できますlsof

  • pidof引数で与えられたプログラムを実行するプロセスのPIDを探します。 1 つ以上のインスタンスが見つかった場合は「true」を返し、そうでない場合は「false」を返します。出力はここでは関係がなく、リダイレクトによって抑制されます。/dev/null
  • lsof特定のファイルを開くすべてのプログラムが一覧表示されます。 1つ以上のプログラムで開かれたファイル記述子がある場合は「true」を返し、それ以外の場合は「false」を返します。

簡単な確認は次のとおりです。

#!/bin/bash

# Check if program is running and image file open. If yes, then exit right away.
if pidof qemu-system-x86_64 >/dev/null && lsof myfile.img >/dev/null
then
    printf -- "An instance of qemu is running and file 'myfile.img' is open. Exiting!\n"
    exit 1
fi

# If at least one is not the case, execute your code here

より複雑な設定では、実際にqemu-system-x86_64自分の設定が開いていることを確認できますmyfile.img

if lsof myfile.img | grep -q '^qemu-system-x86_64'
then
    printf -- "File 'myfile.img' is opened by program 'qemu-system-x86_64'. Exiting!"
    exit 1
fi

grepプログラム名が出力行の最初の項目であることを確認するには、プログラム名にRegEx関連の文字を含めないでください。

おすすめ記事