GNU/Linux >> Linux の 問題 >  >> Cent OS

Linux で SIGKILL または SIGTERM を使用して mysqld を強制終了しているプロセスを見つける方法

シグナルを mysqld に送信しているプロセスを特定するには、Linux カーネルを通じてシグナルを追跡する必要があります。これを行うための 2 つのオプションは次のとおりです。

<オール>
  • 監査ログ (auditd)
  • システムタップ
  • これらの各方法については、次のセクションで説明します。

    監査ログ

    監査ログは簡単に設定できますが、監視対象のプロセスとシグナルを細かく制御することはできません。すべてが含まれています。そのため、ログは非常にノイズが多くなる可能性があるため、プロセスが特定されたらすぐに監視を無効にすることをお勧めします。手順は次のとおりです。

    1. シグナルを監視するように auditd を設定します。これは実行時に行うことも、auditd 構成ファイル (/etc/audit/audit.rules) を介して行うこともできます。 )。追加されたログ出力はかなりノイズが多く (kill -0 を含むすべてのシグナルをログに記録します。つまり、プロセスが生きているかどうかを確認します)、1 つの問題をデバッグするために変更が行われるため、通常は実行時に変更することをお勧めします。これは次のコマンドで行います:

     auditctl -a exit,always -F arch=b64 -S kill -k audit_kill

    2. シグナルによって mysqld が強制終了/シャットダウンされるのを待ちます。

    3. auditd のログ シグナル呼び出しを再度停止します。最も簡単な方法は、再起動することです (構成ファイルにルールを追加した場合は、最初にルールを削除する必要があります)。

    # service auditd restart

    ログ ファイル (通常は /var/log/audit.log ) には次のようなイベントが含まれているはずです:

    type=SYSCALL msg=audit(1450214919.813:148): arch=c000003e syscall=62 success=yes exit=0 a0=f60 a1=9 a2=7f736e706980 a3=0 items=0 ppid=3649 pid=3997 auid=500 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=pts3 ses=1 comm="mykill" exe="/opt/bin/mykill" subj=user_u:system_r:unconfined_t:s0 key="audit_kill"
    type=OBJ_PID msg=audit(1450214919.813:148): opid=3936 oauid=500 ouid=102 oses=1 obj=user_u:system_r:mysqld_t:s0 ocomm="mysqld"

    重要な部分は次のとおりです:

    一般:

    msg=audit(1450214919.813:148) :イベントのタイムスタンプ。これはエポック (1970 年 1 月 1 日午前 0 時 UTC からの時間) です。たとえば、次のことができます。 MySQL の FROM_UNIXTIME() 関数を使用して、通常の日付に変換します:

    mysql> SELECT FROM_UNIXTIME(1450214919);
    +---------------------------+
    | FROM_UNIXTIME(1450214919) |
    +---------------------------+
    | 2015-12-16 08:28:39       |
    +---------------------------+
    1 row in set (0.05 sec)

    type=SYSCALL

    システムコールのトリガーに関する情報。

    syscall=62 :シグナル (kill) であることを意味します:

    # ausyscall 62
    kill

    a1=9 :シグナルが SIGKILL であることを意味します (SIGTERM シグナルの場合、値は 15 です)。
    comm=”mykill” exe=”/opt/bin/mykill” :シグナルを送信するプロセスです。これは、関心のあることです。
    key="audit_kill" :auditctl コマンドの「-k audit_kill」オプションです。追加したルールによってイベントがトリガーされたことを示すだけです。

    type=OBJ_PID

    システムコールのターゲットに関する情報。

    opid=3936 :シグナルを受信するプロセスのプロセス ID (top または ps 出力に表示されるもの) です。
    ouid=102 :プロセスを実行しているユーザーのユーザー ID (/etc/passwd の ID など)。
    ocomm="mysqld" :プロセスの名前。

    したがって、次のオブジェクトが ocomm="mysqld" である場合、type=SYSCALL で a1=9 および key="audit_kill" のイベントを探す必要があります。

    システムタップ

    systemtap には、何を監視し、利用可能な情報で何を行うべきかを指定するスクリプトが必要です。これにより、使用がより複雑になりますが、柔軟性も大幅に向上します。 mysqld プロセスに送信される SIGKILL および SIGTERM を監視するスクリプトの例:

    #! /usr/bin/env stap
    #
    # This systemtap script will monitor for SIGKILL and SIGTERM signals send to
    # a process named "mysqld".
    #
    
    probe signal.send {
      if (
        (sig_name == "SIGKILL" || sig_name == "SIGTERM")
        && pid_name == "mysqld"
      ) {
        printf("%10d   %-34s   %-10s   %5d   %-7s   %s\n",
          gettimeofday_s(), tz_ctime(gettimeofday_s()),
          pid_name, sig_pid, sig_name, execname());
      }
    }
    
    probe begin {
      printf("systemtap script started at: %s\n\n", tz_ctime(gettimeofday_s()));
      printf("%50s%-18s\n",
        "",  "Signaled Process");
      printf("%-10s   %-34s   %-10s   %5s   %-7s   %s\n",
        "Epoch", "Time of Signal", "Name", "PID", "Signal", "Signaling Process Name");
      printf("---------------------------------------------------------------");
      printf("---------------------------------------------------------------");
      printf("\n");
    }
    
    probe end {
      printf("\n");
    }
    注意 :上記のスクリプトは一例です。本番環境で使用する前に、テスト システムでテストしてください。

    スクリプトをファイルに保存します (以下では、ファイル名が mysqld_kill_or_term.stp であると想定しています)。使用法は次のとおりです:

    # stap mysqld_kill_or_term.stp
    systemtap script started at: Fri Dec 18 13:35:44 2015 AEDT
    
                                                      Signaled Process
    Epoch        Time of Signal                       Name           PID   Signal    Signaling Process Name
    ------------------------------------------------------------------------------------------------------------------------------
    1450406150   Fri Dec 18 13:35:50 2015 AEDT        mysqld       21578   SIGKILL   mykill
    1450406161   Fri Dec 18 13:36:01 2015 AEDT        mysqld       21942   SIGKILL   mykill
    1450406171   Fri Dec 18 13:36:11 2015 AEDT        mysqld       22045   SIGTERM   mykill
    ^C


    Cent OS
    1. Linuxでゾンビプロセスを見つけて殺す方法

    2. Linuxでfdコマンドを使用してファイルを検索する方法

    3. Linux でディスクに書き込みを行っているプロセスを特定する方法

    1. Linux –特定のプロセスの名前空間を見つける方法は?

    2. Linux – JavaがインストールされたフォルダでJavaのバージョンを見つける方法は?

    3. Linuxで使用しているシェルを見つける方法

    1. Linuxで.rbで終わるすべてのファイルを見つける方法は?

    2. どのプロセスが自分のプロセスにシグナルを送信したかをLinuxで確認するにはどうすればよいですか

    3. Linuxでファイルを使用しているプロセスを見つける方法は?