Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

There are a few questions and answers on here with regard to being alerted when a process completes/exits(1, 2) – but these all assume that the user has issued said process themselves, and thus can script it with an alert built into the governing script, or pipe the process to some kind of alert.

My situation is that I would like to be alerted of the completion/exit of a process that my user is not initializing. Namely, I am bulk processing massive video files on a Ubuntu 12.04 LTS server. Certain operations on these files take a very long time, so I would like some kind of alert (email would be great) when a specific one finishes. They take so long, that doing this on a one-off basis, manually, based on PIT would be perfectly fine.

To provide more info – let's say I'm processing a particularly big file, and I see that it has progressed on to an FFMPEG script, the process itself being a python script (that is quite complex, and not written by myself, and something I do not wish to modify – though that would be the first logical approach). I imagine issuing a command or script with the PID of said running python script as an argument, and when the process with that PID is no longer running, the alert script does its thing.

Any ideas?

share|improve this question
    
monit (mmonit.com/monit/documentation) seems like a potential option, but much more complex than what I need – hoping there may be a simpler, more direct, and less bloated way of doing only what I am asking, and no more. –  dongle Sep 3 at 14:05

3 Answers 3

up vote 4 down vote accepted

Something like this?

(while kill -0 $pid; do sleep 1; done) && echo "finished"

Replace $pid with the process id and echo "finished" with whatever you want to do when the process exited.

For example:

(while kill -0 $pid; do sleep 1; done) && mail ...
share|improve this answer
    
Phenomenal! Works like a charm. –  dongle Sep 3 at 14:19
    
Minor (and likely obvious) note – when said process is not owned by user, must sudo the kill. –  dongle Sep 3 at 14:25
1  
@dongle, at least on my RHEL box, kill -0 reports No such process for non-existent pids and Operation not permitted for pids owned by a different user so perhaps interpreting the error message should obviate the need for sudo –  1_CR Sep 3 at 16:37
    
If you're echoing, you could always echo -en "\007 \007 \007", which will issue a terminal 'bell'. Whether that translates to an actual audible sound depends on your terminal and hardware (but typically does). –  Morgon Sep 3 at 16:50

If you don't have the pid, this will run until all instances of ffmpeg are finished:

(while pidof ffmpeg | grep -q "[0-9]*"; do sleep 1; done) && echo "finished"
share|improve this answer

I use && to execute a second command when the first is finished successfully. Here some examples:

  1. Delete a big folder and beep:

    rm -rv ~/tmp && beep

  2. Compile a kernel and send an email:

    make && mail -s "Compilation is done" user@yourmaildomain.com

Is this a good way to solve your problem? In another case, you can add an || and a third command in case of failure.

Also, an shell script could receive the exit status ($?) of your command, and with if/else and loops you can do whatever you want.

share|improve this answer
    
Thanks Willian, but as I said, the particular challenge in my use-case is that this is not a command that I am issuing, but an already running process. Thus && is not an option. Thanks anyway. –  dongle Sep 3 at 14:17

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.