Πώς μπορείτε να ελέγξετε το Linux με Python αν μια διαδικασία βρίσκεται ακόμη σε εξέλιξη;

ψήφοι
33

Το μόνο ωραίο τρόπος που έχω βρει είναι:

import sys
import os

try:
        os.kill(int(sys.argv[1]), 0)
        print Running
except:
        print Not running

( Πηγή )
Αλλά αυτό είναι αξιόπιστο; Έχει συνεργαστεί με κάθε διαδικασία και κάθε διανομής;

Δημοσιεύθηκε 01/09/2008 στις 14:20
πηγή χρήστη
Σε άλλες γλώσσες...                            


9 απαντήσεις

ψήφοι
27

σε linux, μπορείτε να δείτε στον κατάλογο / proc / $ PID για να λάβετε πληροφορίες σχετικά με αυτή τη διαδικασία. Στην πραγματικότητα, αν υπάρχει ο κατάλογος, η διαδικασία βρίσκεται σε λειτουργία.

Απαντήθηκε 01/09/2008 στις 14:50
πηγή χρήστη

ψήφοι
11

Θα πρέπει να λειτουργεί σε οποιοδήποτε σύστημα POSIX (αν και κοιτάζοντας το /procσύστημα αρχείων, όπως έχουν προτείνει άλλοι, είναι πιο εύκολο αν ξέρεις ότι πρόκειται να είναι εκεί).

Ωστόσο: os.killμπορεί επίσης να αποτύχει, εάν δεν έχετε άδεια για να σηματοδοτήσει τη διαδικασία. Θα πρέπει να κάνετε κάτι σαν:

import sys
import os
import errno

try:
    os.kill(int(sys.argv[1]), 0)
except OSError, err:
    if err.errno == errno.ESRCH:
        print "Not running"
    elif err.errno == errno.EPERM:
        print "No permission to signal this process!"
    else:
        print "Unknown error"
else:
    print "Running"
Απαντήθηκε 01/09/2008 στις 16:40
πηγή χρήστη

ψήφοι
50

απάντηση Μάρκου είναι ο τρόπος να πάει, μετά από όλα, γι 'αυτό το σύστημα αρχείων / proc είναι εκεί. Για κάτι λίγο πιο copy / pasteable:

 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True
Απαντήθηκε 01/09/2008 στις 17:06
πηγή χρήστη

ψήφοι
6

// Αλλά αυτό είναι αξιόπιστο; Έχει συνεργαστεί με κάθε διαδικασία και κάθε διανομής;

Ναι, θα πρέπει να λειτουργεί σε οποιαδήποτε διανομή Linux. Θα πρέπει να γνωρίζετε ότι το / proc δεν είναι εύκολα διαθέσιμες στα συστήματα Unix βάση, αν και (FreeBSD, OSX).

Απαντήθηκε 05/09/2008 στις 10:02
πηγή χρήστη

ψήφοι
6

Εδώ είναι η λύση που θα λυθεί για μένα:

import os
import subprocess
import re

def findThisProcess( process_name ):
  ps     = subprocess.Popen("ps -eaf | grep "+process_name, shell=True, stdout=subprocess.PIPE)
  output = ps.stdout.read()
  ps.stdout.close()
  ps.wait()

  return output

# This is the function you can use  
def isThisRunning( process_name ):
  output = findThisProcess( process_name )

  if re.search('path/of/process'+process_name, output) is None:
    return False
  else:
    return True

# Example of how to use
if isThisRunning('some_process') == False:
  print("Not running")
else:
  print("Running!")

Είμαι αρχάριος Python + Linux, έτσι αυτό μπορεί να μην είναι η βέλτιστη. Θα λυθεί το πρόβλημά μου, και ελπίζω ότι θα βοηθήσει άλλους ανθρώπους επίσης.

Απαντήθηκε 09/11/2010 στις 20:49
πηγή χρήστη

ψήφοι
5

Μου φαίνεται μια λύση PID με βάση είναι πάρα πολύ ευάλωτο. Εάν η διαδικασία που προσπαθείτε να ελέγξετε την κατάσταση του έχει λήξει, PID της μπορεί να επαναχρησιμοποιηθεί με μια νέα διαδικασία. Έτσι, ShaChris23 ΙΜΟ ο αρχάριος Python + Linux έδωσε την καλύτερη λύση στο πρόβλημα. Ακόμα λειτουργεί μόνο εάν η εν λόγω διαδικασία είναι μοναδικά αναγνωρίσιμο από κορδόνι εντολή του, ή είστε σίγουρος ότι θα υπάρχει μόνο μία λειτουργία κάθε φορά.

Απαντήθηκε 24/02/2011 στις 22:51
πηγή χρήστη

ψήφοι
0

Sligtly τροποποιημένη εκδοχή του σεναρίου ShaChris23. Ελέγχει αν αξία proc_name βρίσκεται μέσα συμβολοσειρά args διαδικασία (για το σενάριο παράδειγμα Python εκτελεστεί με Python):

def process_exists(proc_name):
    ps = subprocess.Popen("ps ax -o pid= -o args= ", shell=True, stdout=subprocess.PIPE)
    ps_pid = ps.pid
    output = ps.stdout.read()
    ps.stdout.close()
    ps.wait()

    for line in output.split("\n"):
        res = re.findall("(\d+) (.*)", line)
        if res:
            pid = int(res[0][0])
            if proc_name in res[0][1] and pid != os.getpid() and pid != ps_pid:
                return True
    return False
Απαντήθηκε 10/08/2011 στις 08:31
πηγή χρήστη

ψήφοι
3

Είχα προβλήματα με τις παραπάνω εκδόσεις (για παράδειγμα η λειτουργία διαπίστωσε επίσης μέρος της σειράς και τέτοια πράγματα ...) Έτσι, έγραψα το δικό μου, τροποποιημένη έκδοση του Μαξίμ Kozlenko του:

#proc    -> name/id of the process
#id = 1  -> search for pid
#id = 0  -> search for name (default)

def process_exists(proc, id = 0):
   ps = subprocess.Popen("ps -A", shell=True, stdout=subprocess.PIPE)
   ps_pid = ps.pid
   output = ps.stdout.read()
   ps.stdout.close()
   ps.wait()

   for line in output.split("\n"):
      if line != "" and line != None:
        fields = line.split()
        pid = fields[0]
        pname = fields[3]

        if(id == 0):
            if(pname == proc):
                return True
        else:
            if(pid == proc):
                return True
return False

Νομίζω ότι είναι πιο αξιόπιστη, πιο εύκολο να διαβάσει και να έχετε τη δυνατότητα να ελέγξει για ταυτότητες ή τα ονόματα διαδικασία.

Απαντήθηκε 02/08/2012 στις 19:05
πηγή χρήστη

ψήφοι
4

Μπορώ να χρησιμοποιήσω αυτό για να πάρει τις διαδικασίες, και ο αριθμός της διαδικασίας του καθορισμένου ονόματος

import os

processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)

if proccount > 0:
    print(proccount, ' processes running of ', processname, 'type')
Απαντήθηκε 15/08/2013 στις 17:54
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more