どうでしょうLinuxのプロセスにおいて年齢?
質問
い問題があゾンビのようなプロセスにあるサーバーが必死でした。たいのですがベストの特定にあたって走るために個室を用意しなければなり時間"と思いますよね(笑)。
解決
も必要とさ:
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h someprocessname;fi
を確認したい場合には何もマッチング
if [[ "$(uname)" = "Linux" ]];then killall -i --older-than 1h someprocessname;fi
の -i
フラグは迅速ないyes/no各プロセス。
他のヒント
した上で回答することができました
警告:この見 し、殺 長期のプロセス
ps -eo uid,pid,etime | egrep '^ *user-id' | egrep ' ([0-9]+-)?([0-9]{2}:?){3}' | awk '{print $2}' | xargs -I{} kill {}
( ユーザー id は特定のユーザーのIDは長年に渡りました)
第二の正規表現に一致するとした時間オプションの日図、時間、分、秒の成分が少なくとも一つの時間の長さになる。
のためのもの以上ある日、
ps aux
まだ答えは、その低減日-精密ない"ということです。
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 7200 308 ? Ss Jun22 0:02 init [5]
root 2 0.0 0.0 0 0 ? S Jun22 0:02 [migration/0]
root 3 0.0 0.0 0 0 ? SN Jun22 0:18 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S Jun22 0:00 [watchdog/0]
だlinuxや他のシステムの/procファイルシステムは、この例では見ることのできないそのプロセス1は年月22日なしの指示までの時間が始まった。
stat /proc/<pid>
つまり正確な答えです。例えば、正確なタイムスタンプをプロセス1、psされることに注意してくださいとしてJun22:
ohm ~$ stat /proc/1
File: `/proc/1'
Size: 0 Blocks: 0 IO Block: 4096 directory
Device: 3h/3d Inode: 65538 Links: 5
Access: (0555/dr-xr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2008-06-22 15:37:44.347627750 -0700
Modify: 2008-06-22 15:37:44.347627750 -0700
Change: 2008-06-22 15:37:44.347627750 -0700
このようにきのリストを取得するための最も古いプロセス:
ps -elf | sort -r -k12 | head -n 10
Jodie Cており、その他のことを指摘 killall -i
使用でき、微使用する場合に名前をつぶしていきます。たい場合には死により、同じパラメータとして pgrep -f
, 利用する必要があり、次のように、純粋なbashの /proc
ファイルシステム.
#!/bin/sh
max_age=120 # (seconds)
naughty="$(pgrep -f offlineimap)"
if [[ -n "$naughty" ]]; then # naughty is running
age_in_seconds=$(echo "$(date +%s) - $(stat -c %X /proc/$naughty)" | bc)
if [[ "$age_in_seconds" -ge "$max_age" ]]; then # naughty is too old!
kill -s 9 "$naughty"
fi
fi
ことができます索キロ以上 max_age
秒の 全工程名;すなわち、工程名 /usr/bin/python2 offlineimap
きによって殺される参照"offlineimap"は、 killall
液ここに示しただけに作用する文字列"python2".
Perlの集::ProcessTableだという:http://search.cpan.org/dist/Proc-ProcessTable/
すでにインストールを行ってくださいdebianやubuntuと sudo apt-get install libproc-processtable-perl
こちらはライナー:
perl -MProc::ProcessTable -Mstrict -w -e 'my $anHourAgo = time-60*60; my $t = new Proc::ProcessTable;foreach my $p ( @{$t->table} ) { if ($p->start() < $anHourAgo) { print $p->pid, "\n" } }'
または、フォーマットを行い、このファイルと呼ばれprocess.pl:
#!/usr/bin/perl -w
use strict;
use Proc::ProcessTable;
my $anHourAgo = time-60*60;
my $t = new Proc::ProcessTable;
foreach my $p ( @{$t->table} ) {
if ($p->start() < $anHourAgo) {
print $p->pid, "\n";
}
}
そこに perl process.pl
こさと汎用性および1秒-分解能にします。
利用できる bc
参加のコマンドmobの答えは、どのように多くの秒ellapsedそして、プロセスを開始:
echo `date +%s` - `stat -t /proc/<pid> | awk '{print $14}'` | bc
編集:
屈しのを待つ長いプロセス、そのた後数分fiddling:
#file: sincetime
#!/bin/bash
init=`stat -t /proc/$1 | awk '{print $14}'`
curr=`date +%s`
seconds=`echo $curr - $init| bc`
name=`cat /proc/$1/cmdline`
echo $name $seconds
を入れればこのお経路と呼ばれるようになります:sincetime
で印刷の程cmdline秒から始まった。掛けることもできますがこのパス:
#file: greptime
#!/bin/bash
pidlist=`ps ax | grep -i -E $1 | grep -v grep | awk '{print $1}' | grep -v PID | xargs echo`
for pid in $pidlist; do
sincetime $pid
done
とみの場合実行します:
greptime <pattern>
がパターン文字列または拡張正規表現ですべての印刷プロセスマッチングパターンの秒から始まった。:)
い ps -aef
.このよろしくおねがいします時間での処理開始。その後の date
コマンドは現在の時刻です。計算との間の差は二つの時代へすでに使用されています。
僕の受け答えが少ないので合わせに基づく処理の名前の悪いプロセス以上のコスト100秒
kill $(ps -o pid,bsdtime -p $(pgrep bad_process) | awk '{ if ($RN > 1 && $2 > 100) { print $1; }}')
stat -t /proc/<pid> | awk '{print $14}'
の開始時間のプロセスからの秒数になりました。比べて現在の時間date +%s
になりましたが、現在の時代へすでに使用されています。
利用のpsのです。しかし、私は行うがないのソース。一般-psするオプションをお伝えする分野による並べ替えができます。並べ替えることができ、出力運転時間、grepのだ.nekoです。
HTH
場合もとてもにこのCを使用できreadproc.h libproc:
#include <proc/readproc.h>
#include <proc/sysinfo.h>
float
pid_age(pid_t pid)
{
proc_t proc_info;
int seconds_since_boot = uptime(0,0);
if (!get_proc_stats(pid, &proc_info)) {
return 0.0;
}
// readproc.h comment lies about what proc_t.start_time is. It's
// actually expressed in Hertz ticks since boot
int seconds_since_1970 = time(NULL);
int time_of_boot = seconds_since_1970 - seconds_since_boot;
long t = seconds_since_boot - (unsigned long)(proc_info.start_time / Hertz);
int delta = t;
float days = ((float) delta / (float)(60*60*24));
return days;
}
たか..えは簡単で
利用できるコマンドのcrontabを直接
* * * * * ps -lf | grep "user" | perl -ane '($h,$m,$s) = split /:/,$F
+[13]; kill 9, $F[3] if ($h > 1);'
または、書くことができまとしてシェルスクリプト
#!/bin/sh
# longprockill.sh
ps -lf | grep "user" | perl -ane '($h,$m,$s) = split /:/,$F[13]; kill
+ 9, $F[3] if ($h > 1);'
電話でのcrontabのようなので、
* * * * * longprockill.sh
私版 sincetime
上記@のラファエルS.Calsaverini:
#!/bin/bash
ps --no-headers -o etimes,args "$1"
この反転出力分野:経過時間初の全コマンドを含む引数です。このことが好で、全コマンドを含む場合があります。