1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

長く実行されているプロセスを消す

Last updated at Posted at 2021-03-11

サーバのプロセスで、あるどこかの開発者がつくったんだけどそれが終了せずずっと動き続けているという経験は、誰しも遭遇したことがあるのではないでしょうか。

そんなときに使えるスクリプトです。 これを crontab などで定期的に実行させると、突如現れた終わらないプロセスを終了してくれます。

増産された Apache (httpd) の子プロセスを消すスクリプト」, 「プロセスの実行ディレクトリをリストアップする」に似たスクリプトです。

コード

AWS EC2 Amazon Linux のサーバ上で動かしました。

#!/bin/bash
for pid in `ps aux | grep crawler | grep -v grep | tr -s ' ' | cut -d ' ' -f2`
do
  line=`ps --pid ${pid} -eo pid,etimes | grep ${pid}`
  duration=`cut -d' ' -f 2 <<< ${line}`
  if [ -z $duration ]
  then
    continue
  fi

  if [ $duration -ge 345600 ]
  then
    echo $duration
    sudo kill $pid
  fi
done

内容

for

for pid in `ps aux | grep target_name | grep -v grep | tr -s ' ' | cut -d ' ' -f2`

これで プロセスID をイテレートします。
target_name のところにフィルタしたい条件文字列を入れて目的のプロセスを見つけ出します。

set line

line=`ps --pid ${pid} -eo pid,etimes | grep ${pid}`

pid と etimes を出力し、 該当の pid についての行を取得します。

set duration

duration=`cut -d' ' -f 2 <<< ${line}`

ps の結果から 実行時間を取得します。
取得できる実行時間の単位は秒です。

-z $duration

  if [ -z $duration ]
  then
    continue
  fi

プロセスがなくなっている時もあるので、そのときは次のイテレーションに進みます。

$duration -ge 345600

  if [ $duration -ge 345600 ]
  then
    echo $duration
    sudo kill $pid
  fi

345,600秒(4日間)以上動いている処理だったら終了します。
sudo から始まるコマンドは、お使いの環境・状況に合わせて変更してください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?