Process uptime in sec

Ez alapján a fórumbejegyzés alapján összeraktam a scriptemet.

[code]
get_process_uptime_in_sec.sh

#!/bin/sh
# GET UPTIME OF THE OLDEST PROCESS IN SECONDS

# jiffy time constant
J="100"
# store process name
PROCNAME="$1"
if [ "$PROCNAME" == "" ]; then exit; fi

# get the pid of the oldest process of that name
PROCPID=`pgrep -o "$PROCNAME"`
if [ "$PROCPID" == "" ]; then exit; fi

# get the start time of the process in jiffy
PROCSTARTTIMEJ=`cat /proc/"$PROCPID"/stat | cut -d " " -f 22`
# convert the starttime of the process to seconds
PROCSTARTTIME=`echo "$PROCSTARTTIMEJ / $J" | bc -l`
# get the uptime of the system in seconds
SYSTEMUPTIME=`cat /proc/uptime | cut -d " " -f 1`
# get the uptime of the process in seconds (integer)
PROCUPTIME=`echo "($SYSTEMUPTIME - $PROCSTARTTIME)/1" | bc`

echo "$PROCUPTIME"
[/code]

Hozzászólások

-PROCPID=`pgrep -o "$PROCNAME"`
+PROCPID=`pidof "${PROCNAME}"`

# Ha kell, itt lehet expr parancsot is hasznalni, `expr ${EXPRESSION}`
-PROCSTARTTIME=`echo "$PROCSTARTTIMEJ / $J" | bc -l`
+PROCSTARTTIME="$((echo ${PROCSTARTTIMEJ} / $J))"

-SYSTEMUPTIME=`cat /proc/uptime | cut -d " " -f 1`
+SYSTEMUPTIME=`cut -d " " -f 1 /proc/uptime`

Nem adok mindenre fixet, mert akkor nem tanulsz. A valtozokat igyekezz _mindig_ ${VARIABLE} formaban hasznalni, kulonben egyes specko esetekben megjarhatod. Inkabb erdemes raszokni.
--


()=() Ki oda vagyik,
('Y') hol szall a galamb
C . C elszalasztja a
()_() kincset itt alant.

pidof helyett azért kell pgrep, hogy csak a legrégebbi process id-t adja vissza, habár cut-tal ki lehetne kapni az utolsót, de ahogy nézem az alaptelepített freebsd-men pidof nincs csak ports-ban, viszont pgrep-et tartalmazza a core rész, ennyi elég nekem :)

köszi a bc helyettesítést, tényleg jobb

cat-ről már kezdtem leszokni, grep-nél már nem használom, de úgy látszik más esetekben még erős a megszokás :D

- ott megy, ahol van pgrep
- PROCNAME felesleges, ott a $1 ;-)
- a `cmd` helyett javaslom a $(cmd) format
- 'cat foo | cut $args' helyett a 'cut $args foo' szebb
- a PROCUPTIME sorban 1-gyel osztasz? ;-)

A vegso tordofes:

ps -eo etime,pid,comm | grep -v PID | sort -n

Tudom, nem masodpercben van, de innen mar az csak egy lepes.

1) "'cat foo | cut $args' helyett a 'cut $args foo' szebb" - ezt javítottam a "sajátomban"... kössz :D .....

2) "ps -eo etime,pid,comm | grep -v PID | sort -n"

ha nincs másodpercben, és uptime>24h, akkor baj:
$ ps -eo etime,pid,comm | grep -v PID | sort -n | awk '/epiphany/ || /dhclient/'
2-02:59:20 30415 dhclient
06:28:13 7064 epiphany-browse

dhclient két napja megy, és mégis előrébb van felsorolva, a "növekvő sorrendben", mint a 6 órája futó epiphany

3) http://brokestream.com/procstat.html, módosítva itt :D [na most jönnek a cések megölni engem, van még benne felesleges kód bőven :D nem vagyok én c-s [még, vagy nem még :D ]. És amúgy is még mindig pid alapján dolgozik a módosított program. - továbbfejleszteni, hogy "pgrep - szerű legyen", és már nem baj, hogy nincs pgrep :D - boccs, este van nah.. :D ]

köszi a javításokat, összegzem az alábbiban (az első integer konverzió tudom hogy felesleges, viszont nem okoz problémát ha mégis lebegőpontost kapnánk a stat-ból más rendszeren):


#!/bin/sh
# GET UPTIME OF THE OLDEST PROCESS IN SECONDS


# jiffy time constant
J="100"
# store process name
PROCNAME="$1"
if [ "$PROCNAME" == "" ]; then exit; fi

# get the pid of the oldest process of that name
PROCPID=`pgrep -o "$PROCNAME"`
if [ "$PROCPID" == "" ]; then exit; fi

# get the start time of the process in jiffy
PROCSTARTTIMEJ=`cut -d " " -f 22 /proc/"$PROCPID"/stat`
# convert to integer
PROCSTARTTIMEJ=${PROCSTARTTIMEJ/.*}
# convert the starttime of the process to seconds
PROCSTARTTIME=$(($PROCSTARTTIMEJ / $J))
# get the uptime of the system in seconds
SYSTEMUPTIME=`cut -d " " -f 1 /proc/uptime`
# convert to integer
SYSTEMUPTIME=${SYSTEMUPTIME/.*}
# get the uptime of the process in seconds (integer)
PROCUPTIME=$(($SYSTEMUPTIME - $PROCSTARTTIME))

echo "$PROCUPTIME"