Can i wait for a process termination that is not a

2019-07-03 19:03发布

问题:

I have a script that has to kill a certain number of times a resource managed by a high avialability middelware. It basically checks whether the resource is running and kills it afterwards, i need the timestamp of when the proc is really killed. So i have done this code:

#!/bin/bash
echo "$(date +"%T,%N") :New measures Run" > /home/hassan/logs/measures.log
for i in {1..50}

do
    echo "Iteration: $i"
    PID=`ps -ef | grep  "/home/hassan/Desktop/pcmAppBin pacemaker_app/MainController"|grep -v "grep" | awk {'print$2'}`
    if [ -n "$PID" ]; then
        echo "$(date +"%T,%N") :Killing $PID" >> /home/hassan/logs/measures.log
        ps -ef | grep  "/home/hassan/Desktop/pcmAppBin pacemaker_app/MainController"|grep -v "grep" | awk {'print "kill -9 " $2'} | sh
        wait $PID
    else
        PID=`ps -ef | grep  "/home/hassan/Desktop/pcmAppBin pacemaker_app/MainController"|grep -v "grep" | awk {'print$2'}`
        until [ -n "$PID" ]; do
                sleep 2
        PID=`ps -ef | grep  "/home/hassan/Desktop/pcmAppBin pacemaker_app/MainController"|grep -v "grep" | awk {'print$2'}`
        done
    fi

done

But with my wait command i get the following error message: wait: pid xxxx is not a child of this shell

回答1:

I assume that You started the child processes from bash and then start this script to wait for. The problem is that the child processes are not the children of the bash running the script, but the children of its parent!

If You want to launch a script inside the the current bash You should start with ..

An example. You start a vim and then You make is stop pressing ^Z (later you can use fg to get back to vim). Then You can get the list of jobs by using the˙jobs command.

$ jobs
[1]+  Stopped                 vim myfile

Then You can create a script called test.sh containing just one command, called jobs. Add execute right (e.g. chmod 700 test.sh), then start it:

$ cat test.sh 
jobs
~/dev/fi [3:1]$ ./test.sh
~/dev/fi [3:1]$ . ./test.sh 
[1]+  Stopped                 vim myfile

As the first version creates a new bash session no jobs are listed. But using . the script runs in the present bash script having exactly one chold process (namely vim). So launch the script above using the . so no child bash will be created.

Be aware that defining any variables or changing directory (and a lot more) will affect to your environment! E.g. PID will be visible by the calling bash!

Comments:

  • Do not use ...|grep ...|grep -v ... |awk --- pipe snakes! Use ...|awk... instead!
  • In most Linux-es you can use something like this ps -o pid= -C pcmAppBin to get just the pid, so the complete pipe can be avoided.
  • To call an external program from awk you could try system("mycmd"); built-in

I hope this helps a bit!