適切なロックを維持するプロセスを終了するには?

適切なロックを維持するプロセスを終了するには?

~しようとする

sudo apt update

しかし、以下を得る:

/var/lib/apt/lists/lockロックを取得できません - 開く(11:リソースを一時的に使用できません)

E: /var/lib/apt/lists/ ディレクトリをロックできません。

最新バージョンのmongodを入手しようとしています。私が見つけたいくつかの指示に従って、次のことを行いました。

$ ps aux | grep apt
5019  0.0  0.0  14224   980 pts/0    S+   02:52   0:00 grep --color=auto apt

しかし、どの部分を入れるべきかわかりません。

kill -9 processnumber <id>

動作させる。

IDのどの部分ですか?このようなことが再発しないようにする方法はありますか?

答え1

名前または引数のリストに基づいてプロセスを終了するには、を使用しますpkill

pkill regexp

名前が拡張正規表現と一致するすべてのプロセスが終了しますregexp

pkill -f regexp

正規表現に一致するスペースで連結された引数のリスト(通常はコマンド名を含む最初のリストを含む)が終了するすべてのプロセスを終了します。

ただし、ここではロックされたファイルを保持しているプロセスを終了したいようです/var/lib/apt/lists/lock。したがって、次のようになります。

fuser -k /var/lib/apt/lists/lock

(一部のフュージョンを使用して実装されています)または

lsof -t /var/lib/apt/lists/lock | xargs kill

より適切かもしれません。

lsof /var/lib/apt/lists/lockまず、どのプロセスを使用しているかを確認したい場合がありますfuser /var/lib/apt/lists/lock。可能であれば、冷静に殺すのではなく、正常に終了してください。

何を書いてもkill -9プロセスがきちんと終了する機会を与えない状況は避けてください。

答え2

これはそれを使用しないでください2つの理由を示していますps … | grep …

psヘッダー行を印刷します。ただし、出力がパイプで接続され、grepgrepパターンがヘッダー行と一致しないため、ヘッダー行は表示されません。ヘッダー行にという列が表示されますPID。この列の値はに渡す必要がある値ですkill

ps … | grep …通常、grepプロセスを実行すると、それ自体が一覧表示されます。あなたの場合、grepプロセスのみを見ることができます。 grepプロセスがランダムであることがわかりますか?パイプは並列に実行され、通常は実行中に開始する時間がありますが、時には非常に高速に実行され、まだps起動していない場合があります。パターンが一致しないことを確認するなど、grepプロセスを見ないいくつかのヒントがあります。grepgreppspsgrep

ps aux | grep '[a]pt'

しかし、これを行うより安定した方法があります。 Linuxやその他のシステムでは、次のソフトウェアを提供しています。pgrep。それは少し似て動作しますps … | grep …が、より安定しています。

pgrep apt

プロセスに関する情報を取得するには、プロセスIDを次に渡すことができますps

ps $(pgrep apt)

すべて殺すには、pgrepコマンドをに変更しますpkill。これらのプロセスの一部のみを終了するには、pgrep必要なプロセスにのみ一致するようにコマンドラインに追加の条件を追加するか、出力からPIDを手動で選択しますps

Linuxpsコマンドは、コマンド名を含むいくつかの基準に基づいてプロセスを一致させることができますが、正確な一致が必要ですが、部分pgrep文字列とより一般的な正規表現の一致を見つけることができます。

ps -C apt     # won't find e.g. apt-get

しかし、これは適切なロック問題を解決する最善の方法ではありません。バラよりStefan Chazerasの答えこのために。

関連情報