www.smiyasaka.com  は、2019 年2月から SSL 化し 通信を暗号化した方式で発信をしています。

Linux サーバプロセス監視プログラム



 perl で作成したプロセスを監視するプログラムの一例です。

下記のサンプルブログセム中の apache2.service, proftpd.service, DiCE.service は、 私が新規に作成したサービスの名前です。
---------------------------------------------------------------------------
プログラムは、match関数を使ったコードを使用しています。
match関数は、一般的には、~ m/(一致を取りたい文字列)/mですが、m を前置すると
正規表現を囲う記号にスラッシュ以外を用いることができるので " [ , ] " を使用
し、パス文字列中の " / " と混在しない様にしました。
match関数の後ろの m は、すべての行を検索対象にする指定です。
---------------------------------------------------------------------------
監視しなければならないプロセスは、httpd, sshd, vsftpd, proftpd, DiCE があります。
プロセス起動の確認情報は、各プロセスで下記の通りです。


  httpd   --->  /usr/local/apache2/bin/httpd
  sshd  --->  /usr/sbin/sshd
  vsftpd  --->  /usr/sbin/vsftpd
  proftpd  --->  proftpd:
  DiCE  --->  /usr/local/DiCE/diced

---------------------------------------------------------------------------
crontab への設定は、下記の様にします。/○○/○○○.pl は、プログラムの保存先 ディレクトリとプログラム名です。 > /dev/null 2>&1 は、忘れないようにして下さい。
参考までに、/dev/null : コマンドの実行結果をすべて null へ捨てる指定です。
    2>&1 : エラーメッセージを捨てる指定です。


  * * * * * /var/www/○○/○○○.pl > /dev/null 2>&1

#!/usr/bin/perl
#----------------------------------------------------------
# CentOS 7.X or CentOS 8.X httpd-2.4.46 用
#
# sshd, httpd, proftpd or vsftpd, DiCE の動作プロセスを監視
# 停止している時には、起動させます
#
#----------------------------------------------------------
$F_SSHD = 0; # 起動チェックフラグ OFF
$F_HTTPD = 0;
$F_FTPD = 0;
$F_DICE = 0;
#------------- ps コマンド起動 ------------------------
my $PS_DATA = `ps -ef`;
#print $PS_DATA;
#
#---------------- sshd ------------------------------------------------
  if ( $PS_DATA=~ m[/usr/sbin/sshd]m) { $F_SSHD++; }
#---------------- httpd-2.4-10 -----------------------------------------
  if ( $PS_DATA=~ m[/usr/local/apache2/bin/httpd]m) { $F_HTTPD++; }
#---------------- proftpd -----------------------------------------------
#  if ( $PS_DATA=~ m[proftpd:]m) { $F_FTPD++; }
#---------------- vsftpd ------------------------------------------------
  if ( $PS_DATA=~ m[/usr/sbin/vsftpd]m) { $F_FTPD++; }
#---------------- DiCE ------------------------------------------------
  if ( $PS_DATA=~ m[/usr/local/DiCE/diced]m) { $F_DICE++; }
#--------------------------------------------------------------------------
# 起動チェックフラグが 0 だったら起動する。
# 起動チェックフラグが 1 の時には、起動中のメッセージ表示をする。
#--------------------------------------------------------------------------
if ( $F_SSHD == 0 ) { system("systemctl start sshd.service"); }
  else { print "sshd active (running)\n"; }

if ( $F_HTTPD == 0 ) { system("systemctl start apache2.service"); }
  else { print "httpd active (running)\n"; }

if ( $F_FTPD == 0 ) { system("systemctl start vsftpd.service"); }
  else { print "vsftpd active (running)\n"; }

#if ( $F_FTPD == 0 ) { system("systemctl start proftpd.service"); }
#  else { print "proftpd active (running)\n"; }

if ( $F_DICE == 0 ) { system("systemctl start DiCE.service"); }
  else { print "DiCE active (running)\n"; }
#--------------------------------------------------------------------------

---------------------------------------------------------------------------
この perl のプログラムを実行した結果は、下記の様になります。

チェックしたプロセスは、すべて稼働している状態です。


sshd  active (running)
httpd   active (running)
vsftpd  active (running)
DiCE  active (running)