2010-08-26 20 views
6

Come posso trovare un pid per nome o riga di comando completa in Ruby, senza chiamare un file eseguibile esterno?Trovare un processo ID per nome

Invio SIGUSR2 a un processo la cui riga di comando contiene ruby job.rb. Vorrei fare quanto segue senza la chiamata a pgrep:

uid = Process.uid 
pid = `pgrep -f "ruby job.rb" -u #{uid}`.split("\n").first.to_i 
Process.kill "USR2", pid 
+0

questo non risponde alla domanda, ma se stiamo già facendo una chiamata di sistema esterno, possiamo anche uccidere il processo proprio lì. Per esempio. '\' pgrep -f 'un lavoro' | xargs kill \ '' – Dennis

risposta

4

Una ricerca su google rapida ha prodotto sys_proctable, che dovrebbe consentire di farlo in modo portatile.

Disclaimer: Non uso Ruby, non posso confermare se funziona.

7

come fare questo dipende dal vostro sistema operativo. Supponendo che Linux, puoi eseguire manualmente la scansione del filesystem/proc e cercare la riga di comando corretta. Tuttavia, questa è la stessa cosa che sta facendo pgrep, e in effetti renderà il programma meno portatile.

Qualcosa del genere potrebbe funzionare.

def get_pid(cmd) 
    Dir['/proc/[0-9]*/cmdline'].each do|p| 
    if File.read(p) == cmd 
     Process.kill("USR2", p.split('/')[1]) 
    end 
    end 
end 

Basta fare attenzione picchiando in/proc.

+0

Parlando di * meno portatile * - questo non funziona su Solaris. Stai presumendo che tu stia correndo su Linux qui. – Beano

+4

Sì, ho detto "assumendo Linux". – AboutRuby

+0

+1 Ho accettato un'altra risposta, ma mi piace anche questa. Un promemoria di quanto si può fare su Linux in qualsiasi lingua con il solo file system – Joel

1

I sistemi basati su Debian trovano pid con comando pidof.

Alcune funzioni proccess uccidere con rubino:

def killPid(cmd) 
    pid=exec("pidof #{cmd}") 
    Process.kill "USR2", pid 
end 
+1

se si eseguono più istanze dello stesso comando con parametri diversi pidof non aiuta –

+0

Questo può essere pericoloso, a seconda di dove il parametro è proveniente da. Stai interpolando una stringa in un comando. La stringa potrebbe essere 'test; rm -rf/var/www/'. [exec] (https://ruby-doc.org/core-2.4.1/Kernel.html#method-i-exec) può prendere cose come questa in più argomenti, quindi 'exec ('pidof', cmd)' sarebbe molto più sicuro – amenthes

Problemi correlati