私たちのシステムは、しばしば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の両方を維持する必要があり、多くのコードを書き換えないことをお勧めします。
ps
バージョン間で同じ動作を得る方法はありますか? (コマンド名は名前の衝突により最初の15文字まで切り捨てられないことがあります。)このプロセスを検出する他の方法はありますか? (
ps -C
C ++、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.d
ps
ところで、こう言うと確かにそんな違いがあるのでしょうか?私は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と一致する必要があります。