[Tutor] is this doable

Cameron Simpson cs at cskk.id.au
Sat Jun 1 19:35:35 EDT 2019


On 01Jun2019 10:02, nathan tech <nathan-tech at hotmail.com> wrote:
>Now it has been mentioned, I do recall, on linux, briefly playing with
>psutil to retrieve memory values for a few tasks I keep running on my
>server.
>
>To that end, I think I now know roughly what to do.
>
>
>Something like this:
>
>import psutil
>import os
>
>path=os.getcwd()+"\\program.exe"

Remark: try:

  r'\program.exe'

instead of:

  "\\program.exe"

because backslash escapes have meaning inside single or double quotes it 
is generally more reliable to use raw strings (r'....') for such strings 
to avoid accidents.

>slist=[]
>for x in psutil.process_iter():
>  if(x.exe()==path):
>   slist.append([x, x.create_time]_)
>
>r.sort() # not sure how to sort by second element, but I'd sort the list
>by start time

list.sort() and sorted() accept an optional key= parameter which is a 
function that takes an element and returns the sort key. For example 
(untested):

  r.sort(key=lambda x: x[1])

to sort on x[1].

>if(len(r)>1):

Stylisticly we tend to just write:

  if r:

It is a convention in Python that collections (such as lists) are 
"false" if they are empty. Urr, I see you said >1, not >0; this remark 
probably isn't relevant. But you could drop the outer brackets, not 
needed in Python:

  if len(r) > 1:

It sounds like your "task" is then a running instance of "program.exe", 
yes? In that case the usual practive is to keep a "pid file" around with 
a distinctive pathname associated with the task. That is just a text 
file containing the process id of the task program.

So rather than iterating over the process list with psutils (which will 
show you _other_ instances of program.exe, perhaps being run for another 
purpose), you just read the pid from the pid file and see if it is 
running. If it is, assume the task is already active.

Untested incomplete example:

  pid_filepath = 'taskname.pid'
  try:
    pid = int(open(pid_filepath).read().strip())
    os.kill(pid, 0)
  except (OSError, ValueError):
    # missing pid file, invalid contents)
    running = False
  else:
    running = True

The "os.kill(pid, 0)" is a UNIX specific idiom for testing for a 
process; you can send signal 0 to a process you own successfully (the 
process itself never sees it); it will fail if the process doesn't exist 
or isn't yours. There should be a Windows equivalent for probing a 
process.

The converse part where you start the process includes this:

  P = subprocess.Popen(.....)   # start the program
  with open(pid_filename, 'w') as pidf:
    print(P.pid, file=pidf)

to update the process id file.
    
Cheers,
Cameron Simpson <cs at cskk.id.au>


More information about the Tutor mailing list