私たちのシステムは、しばしば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>
正確に指定すると正しく動作します。 (実際に言ったことは逆です。部分文字列で指定した場合にのみ機能します。)