Wszystkie procesy użytkowników oprócz root czas uruchomiwnia procesu powyżej godziny

0

Skrypt ma wyświetlać wszystkie procesy OS (poza tymi uruchomionymi na użytkowniku root), które są uruchomione dłużej niż 1h.
Skrypt powinien wyświetlić na ekran taki komunikat np.:

Proces - "użytkownik, na którym proces został uruchomiony" "pid procesu" "komenda procesu" - wykonuje sie 1h:7m:39s

Jeśli znajdzie więcej niż jeden, komunikaty mają się wyświetlić, jeden pod drugim:

Proces - "użytkownik, na którym proces 1 został uruchomiony" "pid procesu 1" "komenda procesu 1" - wykonuje sie 1h:7m:39s

A to co mam do tej pory.

Skrypt ma wyświetlać wszystkie procesy OS (poza tymi uruchomionymi na użytkowniku root), które są uruchomione dłużej niż 1h.

#!/bin/bash

ps ax -o uname,pid,etimes,command |
while read LINE
do
    eval $(echo $LINE |
    awk '{unme=$1; pid=$2; printf "echo -n \"%s  \"; pwdx %s\n", etime, command}' )
done
~



tu druga wersja bardziej chodząca, nie spełniająca wszystkich wymagań
#!/bin/bash

#echo Proces "$USR" "$PID" "$KOM" wykonuje się: $CZAS


IFS=$'\n'
for i in `ps ax -o uname,pid,etimes,command | cat | awk '($1 !="root" && $3 <="3600") {print "Proces " $1 " " " " $2 "  " "  " $4 " " $5 " " $6 " " $7 " Wykonuje się:" " " $3 }'`;

  do
                        echo $i

done


Wersja po wyżej nie jest elasyczna i przy dłuższych komendach obcina oraz nie konwertuje czasu z sekund na godziny (forma zjadliwy dla użytkoników)

Proszę o pomoc

0
ps -eo "%t %u %p %a" | grep -v root | grep -E '[0-9]{2}:[0-9]{2}:[0-9]{2}'

Następnie wycinasz poszczególne kolumny i układasz zgodnie z formatem napisu.
Komendę z argumentami będziesz miał na końcu więc łatwo można ją wyciąć.

0
malencki napisał(a):
ps -eo "%t %u %p %a" | grep -v root | grep -E '[0-9]{2}:[0-9]{2}:[0-9]{2}'

Następnie wycinasz poszczególne kolumny i układasz zgodnie z formatem napisu.
Komendę z argumentami będziesz miał na końcu więc łatwo można ją wyciąć.

Nie jestem doświadczony w programowaniu mógłbyś rozwinąć ...Następnie wycinasz poszczególne kolumny ...może jakiś przykład lub w którym kodzie to najlepiej zrealizować?
Tam jeszcze musi porównywać kolumnę etime i sprawdzać wartość większą bądź równą 3600 s i wyświetlał wszystkie.

0

Twoim stylem z awk, chyba jakoś tak:

ps -eo "%t %u %p %a" | grep -E '^\s+?([0-9]+-)?[0-9]{2}:[0-9]{2}:[0-9]{2}\s+[^root]' | awk '{uname=$2;pid=$3;uptime=$1;$1=$2=$3=""};{print uname " " pid $0 ", wykonuje się: " uptime}'

Głównie chodzi mi o to, że niepotrzebnie używasz pętli.
Zadanie da się wykonać w jednym poleceniu.

0
malencki napisał(a):

Twoim stylem z awk, chyba jakoś tak:

ps -eo "%t %u %p %a" | grep -E '^\s+?([0-9]+-)?[0-9]{2}:[0-9]{2}:[0-9]{2}\s+[^root]' | awk '{uname=$2;pid=$3;uptime=$1;$1=$2=$3=""};{print uname " " pid $0 ", wykonuje się: " uptime}'

Głównie chodzi mi o to, że niepotrzebnie używasz pętli.
Zadanie da się wykonać w jednym poleceniu.

#!/bin/bash


ps ax -o uname,pid,etimes,command | grep -v root | while read -r username pid time com ;
do
# echo $username
# echo $pid
# echo $time
# echo $com
 if [[ $time -eq "3600" ]];
 then
    echo Proces $usr  $pid $com  -wykonuje sie: $time
 fi

done


Nie wyświetla wyniku. Ma porównywać 3600s i później wyświetlić w dniach godzinach itp...

0

Nie mam wyniku tej pętli. Brak wyniku bez błędu. A głównie chodzi o to żeby pokazał wszystkie procesy użytkownika bez root --te który zaczęły się co najmniej 1h temu.

A i pytanko do twojej odpowiedzi wyżej czy to polecenie wyszukuje tych po wyżej godziny? Jeżeli tak to wskaż, które to miejsce

0

Proszę:

grep -E '^\s+?([0-9]+-)?[0-9]{2}:[0-9]{2}:[0-9]{2}

Wycina minimum 3 człony (XX:XX:XX), więc w tym formacie który podaje ps, zawsze będzie to więcej niż godzina.

U siebie popraw

$time -eq "3600" #=> $time -gt "3600"

Twój skrypt powinien, działać.

0
malencki napisał(a):

Proszę:

grep -E '^\s+?([0-9]+-)?[0-9]{2}:[0-9]{2}:[0-9]{2}

Wycina minimum 3 człony (XX:XX:XX), więc w tym formacie który podaje ps, zawsze będzie to więcej niż godzina.

U siebie popraw

$time -eq "3600" #=> $time -gt "3600"

Twój skrypt powinien, działać.

To ma być w pętli if?

0

#!/bin/bash


ps ax -o uname,pid,etimes,command | grep -v root | while read -r username pid time com ;
do
# echo $username
# echo $pid
# echo $time
# echo $com
 if [[ $time -eq "3600" #=> $time -gt "3600" ]];
 then
    echo Proces $username  $pid $com  -wykonuje sie: $time
 fi

done



./skryptos2: line 10: syntax error in conditional expression
./skryptos2: line 11: syntax error near then' ./skryptos2: line 11: then'

0

:D OK Poprawiłem:


#!/bin/bash


ps ax -o uname,pid,etimes,command | grep -v root | while read -r username pid time com ;
do
# echo $username
# echo $pid
# echo $time
# echo $com

if [[ $time -gt "3600" ]];
 then
    echo Proces $username  $pid $com  -wykonuje sie: $time
 fi

done

A jak wyświetlić normalny format nie sekundy? $time

0

Jak to zapisać tak zgrabnie $time=/3600?

0

Możesz użyć date (na końcu polecenia echo), tak chyba będzie najprościej:

`date "+%H godzin %M minut %S sekund" -d @$time`

Ale będzie mały problem z dniami :)

0

Proces opph7481 578817 php-fpm: pool opt_ext_ph7481 -wykonuje sie: 203392 sekund to jest 09 godzin 29 minut 52 sekund

Zrobiłem jak wyżej, a żeby zamienić od razu czas na taki jak powinien być?

0

I ostatnie pytanie czy przy dłuższej komendzie nie będzie obcinał pola z komendą?

0

porównałem wyniki tego pierwszego skryptu w jednej linijce i tego mojego nie pokazuje ilości dni. Jak w tym pierwszym.

0

dopisałem +%j

0

Mam pytanie przerobiłem skrypt tak, aby jeżeli znajdzie cokolwiek ma wyświetlać Exid Code 2 Critical w przeciwnym wypadku OK czyli exit code 0.


#!/bin/bash


ps ax -o uname,pid,etimes,command | grep -v root | while read -r username pid time com ;
do
# echo $username
# echo $pid
# echo $time
# echo $com

if [[ $time -gt "3600" ]] && [[ $com != "" ]];
 then
    echo Proces $username  $pid $com  -wykonuje sie: $time sekund to jest `date "+%j dni %H godzin %M minut %S sekund" -d @$time`
   echo "Exit Code 2"
   else
    echo "Exit Code 0"
fi
done

Czy to tak zadziała prawidłowo?
Chodziło by mi bardziej, żeby Jak będzie cokolwiek to ma zadziałać i pokazać , jak nie to tylko code 0 i OK.

0
#!/bin/bash

test=`ps ax -o uname,pid,etimes,command | grep -v root`
#if [[ -n $test ]];
#then
#echo "jest exit code 2"
#else
#echo "OK print code 0"
#fi

ps ax -o uname,pid,etimes,command | grep -v root | while read -r username pid time com ;

do
if [[ -n $test ]];
then
echo "jest exit code 2"
else
echo "OK print code 0"
fi

if [[ $time -gt "3600" ]];
 then
    echo Proces $username  $pid $com  -wykonuje sie: $time sekund to jest `date "+%j dni %H godzin %M minut %S sekund" -d @$time`

fi


done


Zrobiłem coś takiego, testuje wykonanie polecenia i jak jest nie pusty wyrzuca odpowiedni komunikat.

0

Po wyżej chodzi o zaimplementowanie kodu błędu żeby jak znajdzie procesy wykonujące się po wyżej 1h to exit 2, a jak nie znajdzie to OK i exit 0. Jak to zaimplementować,żeby w przypadku znalezienia procesów wykonujących się powyżej godziny wyświetlił je plus exit cod 2. Bo jak go wprowadzam to wyświetla mi tylko jedno wykonanie.

#!/bin/bash


ps ax -o uname,pid,etimes,command | grep -v root | while read -r username pid time com ;

do

if [[ $time -gt "3600" ]];
then
    echo Proces $username  $pid $com  -wykonuje sie: $time sekund to jest `date "+%j dni %H godzin %M minut %S sekund" -d @$time` | >&1
fi
done

if [ $1 !=" " ];
then
   exit 2
else
   exit 0
fi



--------------------------------
echo Proces $username  $pid $com  -wykonuje sie: $time sekund to jest `date "+%j dni %H godzin %M minut %S sekund" -d @$time`
exit 2

Proszę o pomoc.

0

Możesz dać znacznik wewnątrz pętli, a następnie zwrócić go z tego sub-polecenia (while-do-done). Jest kilka sposobów na wykonanie tego zadania

A możesz to rozwinąć jakiś przykład?
Bo teraz nie mam żadnego wyniku wykonania, ale echo $? daje 2. Więc ok, ale jak zrobić żeby wyświetlał wyniki plus exit code.? Proszę o odpowiedź.

Teraz zmieniłem bez >&1 i wynik mam taki
Proces polkitd 748 /usr/lib/polkit-1/polkitd --no-debug -wykonuje sie: 3002415 sekund to jest 035 dni 19 godzin 00 minut 15 sekund
Proces libstor+ 749 /usr/bin/lsmd -d -wykonuje sie: 3002415 sekund to jest 035 dni 19 godzin 00 minut 15 sekund
Proces dbus 752 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only -wykonuje sie: 3002415 sekund to jest 035 dni 19 godzin 00 minut 15 sekund
ale nie mam kodu błędu na ekranie.

0

Problem można rozwiązać na wiele sposobów.
Na przykład funkcją:

function fun(){
  ps ax -o uname,pid,etimes,command | grep -v root | (while read -r username pid time com ;  do
  if [[ $time -gt "3600" ]];
  then
      echo Proces $username  $pid $com  -wykonuje sie: $time sekund to jest `date "+%j dni %H godzin %M minut %S sekund" -d @$time` >&2
      p=1
  fi
  done && echo $p)
}

p="$(fun)"
[[ ! -z $p ]] && exit 2
exit 0

Musisz zobaczyć czy działa, nie testowane.

0

A coś prostego do implementacji?

0

Sprawdzałem brak wyników :(. Tzn. nie wyświetla wyników polecenia,ale po echo $? jest 2.

0

Działa, ale nadal nie wyświetla exit code na ekran :(

0

echo 2>&1 ?

0

Nie wiem gdzie to dopisać bo w sumie efekt mam taki sam jak z pętlą if tylko mam funkcję ;(() help..

0

Jakaś podpowiedź, bo mi się pomysły skończyły. Pomocy

0

A rozwiązanie tego problemu:

#!/bin/bash

tmp=`mktemp`

ps ax -o uname,pid,etimes,command | grep -v root | while read -r username pid time com ;

do

if [[ $time -gt 3600 ]];
 then
    echo Proces $username  $pid $com  -wykonuje sie: $time sekund to jest `date "+%j dni %H godzin %M minut %S sekund" -d @$time` >> $tmp
fi
done



if [[ -s $tmp ]]; then
  cat $tmp
  rm $tmp
  exit 2
else
  echo OK
  rm $tmp
  exit 0
fi

1 użytkowników online, w tym zalogowanych: 0, gości: 1