ps -Cの動作がCentos 6とCentos 8の間で変更されました。

ps -Cの動作がCentos 6とCentos 8の間で変更されました。

私たちのシステムは、しばしばps -C cmdNameプロセスが実行されていることを確認し、そうでない場合は再起動に使用されます。

Centos 6からCentos 8に移行すると、動作に変化があるように見えましps -Cた。

セントース6(32ビット)

はい、プロセスがあります。

# ps aux | grep DvBuildSegmentList
root     16223  4.0  0.1  16064 11272 pts/0    S    14:14   0:00 ./DvBuildSegmentList
root     16264  0.0  0.0   4416  1880 pts/0    S+   14:14   0:00 grep DvBuildSegmentList

そして、ps -C完全なコマンド名からプロセスを検出します。

# ps -C DvBuildSegmentList
  PID TTY          TIME CMD
16223 pts/0    00:00:00 DvBuildSegmentL

(出力で切り捨てられたコマンドラインに注意してください)

セントース8(64ビット)

はい、プロセスがあります。

# ps aux | grep DvBuildSeg
root     15282  0.9  0.2  99796 42424 pts/1    S    14:18   0:04 ./DvBuildSegmentList
root     16989  0.0  0.0 221900  1104 pts/1    S+   14:26   0:00 grep --color=auto DvBuildSeg

完全なコマンド名を使用する出力はありません。

# /bin/ps -C DvBuildSegmentList
  PID TTY          TIME CMD

ただし、短縮されたコマンド名を使用すると、プロセスが検出されます。

# /bin/ps -C DvBuildSegmentL
  PID TTY          TIME CMD
15282 pts/1    00:00:06 DvBuildSegmentL

32ビットCentos 6と64ビットCentos 8の両方を維持する必要があり、多くのコードを書き換えないことをお勧めします。

  1. psバージョン間で同じ動作を得る方法はありますか? (コマンド名は名前の衝突により最初の15文字まで切り捨てられないことがあります。)

  2. このプロセスを検出する他の方法はありますか? (ps -CC ++、Perl、PHP、およびBashにわたって多くのコードとメソッドが広がっています)

私を編集する

それほど価値のある内容は、切り捨てられた/proc/<pid>/statファイル名を表示します。

cat /proc/4605/stat
4605 (DvBuildSegmentL) S 25769 4605 25769 34817 4605 1077936384 10536 304 0 0 225 119 0 0 20 0 1 0 6717759 103620608 10945 18446744073709551615 4194304 4339868 140734307933616 0 0 0 0 4096 16901 1 0 0 17 4 0 0 0 0 0 6438088 6440229 11730944 140734307937640 140734307937666 140734307937666 140734307938275 0

しかし、/proc/<pid>/cmdline前には完全なパスがありますが、完全なコマンド名があります。

cat -v /proc/4605/cmdline
/usr/local/blah/blah/blah/DvBuildSegmentList^@-d^@2^@

答え1

この違いを解決する1つの方法は、procpsパッケージのCentOS 6バージョンを再構築してそこyum swapから始めることですprocps-ng。最も安全な方法ではありませんが、多くのシステムプログラムを以前のバージョンに置き換えます。

procpsしたがって、まったく異なる名前で再構築してインストールしたい場合がありますps。その後、ツールを使用して、インクルードディレクトリがシステムに存在することを確認/opt/el6-rebuilds/bin/psできます。結果はCentOS 8で使用されている「CentOS 6クラス」バージョンになります。PATH/etc/profile.dps

ところで、こう言うと確かにそんな違いがあるのでしょうか?私はRHEL 8でこれを試しましたが、ps -C <program name>正確に指定すると正しく動作します。 (実際に言ったことは逆です。部分文字列で指定した場合にのみ機能します。)

答え2

この2つの方法は、異なるOSバージョンで動作するようです。

grep はプロセス名を取得します。

ps aux | grep myLongProcessName | grep -v

プロセスが実行中の場合は0を返し、プロセスが見つからない場合は1を返します。 2番目のコマンドがgrep -v必要なのは、時々(常にではありません)、grepコマンド自体がの出力に表示されるためですgrep myLongProcessName

killall経由で信号0を送信

killall -0 myLongProcessName

0プロセスが存在するのか、1それとも見つからなかったのかを返します。

「double」メソッドは、実際に他のプロセスの部分文字列の場合はgrep失敗します。myLongProcessName例えば。 3つのプロセスがある場合:

  • longProcessDBAccess(実行されません)
  • longProcessDBAccessManager(走る)
  • longProcessDBAccessClient(走る)

grep実行中であることを確認するために「double」メソッドを使用すると、longProcessDBAccess他の2つのメソッドの存在も検出されるため失敗します。

ただし、このkillall方法が機能するには、uid実行中のプロセスにkillallそのタスクを実行する権限が必要です。

殺す:

このkill()関数は、指定されたプロセスまたはプロセスグループにシグナルを送信する必要がありますpid。送信される信号はで指定され、に提供されているsig リストの1または0です<signal.h>。 0(ヌル信号)の場合、sigエラーチェックは実行されますが、実際に信号は送信されません。空の信号を使用して検証することができます pid

プロセスが指定されたプロセスにシグナルを送信する権限を持つには、転送プロセスに適切なpid権限がない限り、転送プロセスの実際のまたは有効なユーザーIDは、受信プロセスの実際のまたは保存されたset-user-IDと一致する必要があります。

関連情報