Pagina 1 di 1

script funzionamento processi

Inviato: gio 13 set 2007, 10:34
da marco79
Ciao a tutti ho uno script perl che va a leggere se un processo é attivo e scrive poi del codice html .Per far questo va a leggere il file /var/run/asterisk.pid nel mio caso e altri /var/run/crond.pid /var/run/httpd.pid.Il problema é che pur essendo tutti i processi funzionanti il processo relativo ad asterisk risulta STOPPED secondo lo script penso per un problema di permessi:


-rw-r--r-- 1 root root 5 Sep 12 12:40 asterisk.pid
-rw-r--r-- 1 root root 5 Sep 11 16:19 crond.pid
-rw-r--r-- 1 root root 5 Sep 11 16:19 httpd.pid

Quale puo essere il problema?

Inviato: gio 13 set 2007, 18:12
da alessiodf

Codice: Seleziona tutto

~> cat /proc/self/status | grep State
State:  R (running)
perl??? :oops:

fai prima con bash

ps: self = #PID processo

Inviato: gio 13 set 2007, 18:17
da targzeta
alessiodf ha scritto:

Codice: Seleziona tutto

~> cat /proc/self/status | grep State
E se fai:

Codice: Seleziona tutto

 > grep State /proc/self/status
Che ci perdi? Perchè lanciare due processi quando grep è stato inventato a posta?

Spina

Inviato: gio 13 set 2007, 18:25
da alessiodf
spina ha scritto:
alessiodf ha scritto:

Codice: Seleziona tutto

~> cat /proc/self/status | grep State
E se fai:

Codice: Seleziona tutto

 > grep State /proc/self/status
Che ci perdi? Perchè lanciare due processi quando grep è stato inventato a posta?

Spina
ovvio ma... o,o

che centra? :oops:

Inviato: gio 13 set 2007, 20:48
da targzeta
alessiodf ha scritto:ovvio ma... o,o

che centra? :oops:
Niente :), solo che in molti post leggo la sequenza
cat | grep
, non ho capito ancora se molti la usano perchè vista in altri thread o perchè l'hanno letta da qualche parte.....bhò, alla fine, chi se ne frega :).

comunque sono convinto come te che non bisogna scomodare perl, ma penso che lui lo faccia per generare il codice html.


@marco79
Io non credo ci siano errori di permessi, da quello che hai postato chiunque può aprire il file in lettura. Come fà lo script ad identificare che il processo è in run? Legge il pid e poi fa un controllo? Se si, che controllo fa? Come suggerito da alessiodf, puoi prelevare il pid dal file, ad esempio con:

Codice: Seleziona tutto

pid=`cat /var/run/asterisk.pid`
e poi fare un controllo con:

Codice: Seleziona tutto

grep State /proc/$pid/status
comunque, a regola, se esiste il file "asterisk.pid", a prescindere, il processo dovrebbe essere in run, dipende anche da cosa si intende per "run".

Spina

Inviato: gio 13 set 2007, 23:23
da alessiodf
non ho capito ancora se molti la usano perchè vista in altri thread o perchè l'hanno letta da qualche parte.....bhò, alla fine, chi se ne frega
chiamandosi pipe-line aiuta a `seguire` le operazioni...

Inviato: ven 14 set 2007, 9:45
da marco79
Il fatto di usare perl dipende dal fatto che lo script non l'ho fatto io e poi perchè genera del codice html che viene richiamato in un pagina php.Lo script usa una funzione:
.

Codice: Seleziona tutto

sub isrunning
{
        my $cmd = $_[0];
        my $status = "<TABLE CELLPADDING='2' CELLSPACING='0' BGCOLOR='$colourlightred'><TR><TD>stopped</TD></TR></TABLE>";
        my $pid = '';
        my $testcmd = '';
        my $exename;

        $cmd =~ /(^[a-z]+)/;
        
        $exename = $1;

        if (open(FILE, "/var/run/${cmd}.pid"))
        {
                $pid = <FILE>; chop $pid;
                close FILE;
                if (open(FILE, "/proc/${pid}/status"))
                {
                        while (<FILE>)
                        {
                                if (/^Name:\W+(.*)/) {
                                        $testcmd = $1; }
                        }
                        close FILE;
                        if ($testcmd =~ /$exename/)
                        {
                                $status = "<TABLE CELLPADDING='2' CELLSPACING='0' BGCOLOR='$colourlightgreen'><TR><TD>running</TD></TR></TABLE>";
                                if (open(FILE, "/proc/${pid}/cmdline"))
                                {
                                        my $cmdline = <FILE>;
                                        if (!$cmdline) {
                                                $status = "$status (swapped)"; }
                                }
                        }
                }
        }

        return $status;
}
In pratica va a vedere se cé il pid.
Asterisk funziona come gli altri solo che gli altri mi dice running e asterisk stopped...bo

Inviato: ven 14 set 2007, 10:09
da alessiodf

Codice: Seleziona tutto

cat /var/run/asterisk.pid
che ti ritorna quando il processo e' in running?

Inviato: ven 14 set 2007, 14:29
da marco79

Codice: Seleziona tutto

cat /var/run/asterisk.pid
8779

Inviato: ven 14 set 2007, 14:46
da alessiodf

Codice: Seleziona tutto

cat "/proc/`cat /var/run/asterisk.pid`/status"
posta... ho un presentimento... :D

Inviato: ven 14 set 2007, 15:39
da marco79

Codice: Seleziona tutto

 cat /proc/`cat /var/run/asterisk.pid`/status
Name:   asterisk
State:  S (sleeping)
SleepAVG:       78%
Tgid:   8779
Pid:    8779
PPid:   8775
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0 1 2 3 4 6 10
VmPeak:    25160 kB
VmSize:    25120 kB
VmLck:         0 kB
VmHWM:     10404 kB
VmRSS:     10400 kB
VmData:    12408 kB
VmStk:        88 kB
VmExe:       860 kB
VmLib:      9324 kB
VmPTE:        60 kB
StaBrk: 08132000 kB
Brk:    09cd9000 kB
StaStk: bfba06a0 kB
ExecLim:        49eb6000
Threads:        22
SigQ:   1/7162
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001004
SigCgt: 0000000181414003
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
Cpus_allowed:   ffffffff
Mems_allowed:   1

Inviato: ven 14 set 2007, 16:37
da alessiodf

Codice: Seleziona tutto

#!/bin/bash
# @author: Slux <alessiodf>
RUN_DIR="/var/run/"

# here only the file names without the extension
ARRAY_PIDS=( crond httpd mysqld pure-ftpd sshd cups hald )
####################################

cd $RUN_DIR


echo -e "#PID\tPid file\tState"
echo
for fpid in `echo ${ARRAY_PIDS[*]}` 
	do
	CURRENT_PID=`cat $fpid.pid`
	if [[ "$CURRENT_PID" =~ [0-9]+ ]]
		then 
		echo -en "$CURRENT_PID\t"
		echo -en "$fpid\t\t"
		
		if [[ "`grep Name /proc/$CURRENT_PID/status`" =~ $fpid ]]
			then
			echo -e "RUNNING"
		else
			echo -e "NOT RUNNING"
		fi
		
	else 
		echo -e "Empty\t$fpid\t\tUnknow"
	fi
done

prova questo e vedi che ti restituisce! a me questo:

Codice: Seleziona tutto

#PID    Pid file        State

5951    crond           RUNNING
6143    httpd           RUNNING
6058    mysqld          RUNNING
6087    pure-ftpd       RUNNING
6018    sshd            RUNNING
Empty   cups            Unknow
5905    hald            RUNNING
nell'array ARRAY_PIDS aggiungi quelli che hai tu sotto /var/run/ 8)

Inviato: mar 18 set 2007, 9:11
da marco79
Con questo script funziona :)
Vorrei capire pero perché con l'altro non funziona quale era il tuo presentimento?

Inviato: mar 18 set 2007, 17:47
da alessiodf
bho... faccio + o - le stesse operazioni dello script! :)

semmai usa questo e ci metti codice html! :o Se hai difficolta' dimmi, che ti aiuto!

il presentimento era che come cups, anche asterisk avesse un pid-file vuoto! :?