BASH 1 saatten büyük kullanıcı için işlemleri öldür

1 saatten daha eski bir kullanıcı adı için tüm süreçleri bulabilecek ve onları öldürecek tek bir liner yazmaya çalışıyorum. Aşağıdakilere sahibim:

for each in $(find /proc -maxdepth 1 -user hobbyisl -type d -mmin +60 -exec basename {} \;); do kill -9 $file; done

Aşağıdaki bölüm süreçleri doğru bir şekilde tanımlamaktadır:

find /proc -maxdepth 1 -user hobbyisl -type d -mmin +60 -exec basename {} \;

Her şeyi çalıştırırken, aşağıdaki hatayı alıyorum:

kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]

Birisi lütfen yardım edebilir mi?

0

8 cevap

In your loop the $each (each is not part of the syntax - it's a variable name) variable holds the process id and not $file

Bunu dene:

for each in $(find /proc -maxdepth 1 -user hobbyisl -type d -mmin +60 -exec basename {} \;); do kill -9 $each; done

Ancak, process_id gibi değişkenler kullanmanızı öneririm. her bir değil, bunun gibi hatalara yol açabilir :)

4
katma
@EtanReisner Yorumunuz için teşekkürler. Zaten düzeltildi
katma yazar damgad, kaynak
ALL_CAPS değişkenleri, kabuk tarafından kullanılmak üzere "ayrılmıştır" ve kod dosyasında sakınılmalıdır.
katma yazar Etan Reisner, kaynak

In your loop the $each (each is not part of the syntax - it's a variable name) variable holds the process id and not $file

Bunu dene:

for each in $(find /proc -maxdepth 1 -user hobbyisl -type d -mmin +60 -exec basename {} \;); do kill -9 $each; done

Ancak, process_id gibi değişkenler kullanmanızı öneririm. her bir değil, bunun gibi hatalara yol açabilir :)

4
katma
@EtanReisner Yorumunuz için teşekkürler. Zaten düzeltildi
katma yazar damgad, kaynak
ALL_CAPS değişkenleri, kabuk tarafından kullanılmak üzere "ayrılmıştır" ve kod dosyasında sakınılmalıdır.
katma yazar Etan Reisner, kaynak

for ifadeniz each değişkenini kullanır. kill ifadeniz file değişkenini kullanır. Böylece hata.

2
katma
Ooh, "her" bir değişkenin değil, bir fonksiyon parametresi olduğu izlenimindeydim. Ders öğrenildi - çok teşekkürler :)
katma yazar Neekoy, kaynak

for ifadeniz each değişkenini kullanır. kill ifadeniz file değişkenini kullanır. Böylece hata.

2
katma
Ooh, "her" bir değişkenin değil, bir fonksiyon parametresi olduğu izlenimindeydim. Ders öğrenildi - çok teşekkürler :)
katma yazar Neekoy, kaynak

killall komutu, koştuğunuz her yerde varsa bunu yerel olarak destekler:

killall -u foo -o 2m çubuğu

  • -u foo - specify a the user foo
  • -o 2m - filter by processes older than 2 minutes
  • bar additional filter (only processes containing 'foo' in the command)
0
katma

killall komutu, koştuğunuz her yerde varsa bunu yerel olarak destekler:

killall -u foo -o 2m çubuğu

  • -u foo - specify a the user foo
  • -o 2m - filter by processes older than 2 minutes
  • bar additional filter (only processes containing 'foo' in the command)
0
katma

İşte ps, awk, xargs kullanarak bir tek liner. Kullanıcıyı root yerine doğru olanı değiştirin ve işlemi gerçekten öldürmek için xargs'den echo 'u kaldırın.

ps -u root -o pid,etime | awk '{split($2,t,":"); split(t[1],t,"-"); if (int(t[2])>1) print $1;}' | xargs -I _ echo kill _

Biraz açıklamak için:

  • pid işlem kimliğidir
  • işlem başlatıldığından bu yana geçen süre

Not: Bu bir günden daha eski süreçleri işleyecektir (awk'deki bölünmüş şey yüzünden).

güncelleme: biraz uzun awk ama:

ps -u root -o pid,etime | awk '{split($2,t,":"); n=0; for(i in t) n++; if(n > 2) { split(t[1],a,"-"); j=0; for(i in a) j++; x=a[1]; if(j>1) {x=a[2]} if(int(x)>0) print $1 }}' | xargs -I _ echo kill _
0
katma

İşte ps, awk, xargs kullanarak bir tek liner. Kullanıcıyı root yerine doğru olanı değiştirin ve işlemi gerçekten öldürmek için xargs'den echo 'u kaldırın.

ps -u root -o pid,etime | awk '{split($2,t,":"); split(t[1],t,"-"); if (int(t[2])>1) print $1;}' | xargs -I _ echo kill _

Biraz açıklamak için:

  • pid işlem kimliğidir
  • işlem başlatıldığından bu yana geçen süre

Not: Bu bir günden daha eski süreçleri işleyecektir (awk'deki bölünmüş şey yüzünden).

güncelleme: biraz uzun awk ama:

ps -u root -o pid,etime | awk '{split($2,t,":"); n=0; for(i in t) n++; if(n > 2) { split(t[1],a,"-"); j=0; for(i in a) j++; x=a[1]; if(j>1) {x=a[2]} if(int(x)>0) print $1 }}' | xargs -I _ echo kill _
0
katma