How to capture a process Id and also add a trigger when that process finishes in a bash script?

爱⌒轻易说出口 提交于 2019-12-13 06:13:32

问题


I am trying to make a bash script to start a jar file and do it in the background. For that reason I'm using nohup. Right now I can capture the pid of the java process but I also need to be able to execute a command when the process finishes.

This is how I started

nohup java -jar jarfile.jar & echo $! > conf/pid

I also know from this answer that using ; will make a command execute after the first one finishes.

nohup java -jar jarfile.jar; echo "done"

echo "done" is just an example. My problem now is that I don't know how to combine them both. If I run echo $! first then echo "done" executes immediately. While if echo "done" goes first then echo $! will capture the PID of echo "done" instead of the one of the jarfile.

I know that I could achieve the desire functionality by polling until I don't see the PID running anymore. But I would like to avoid that as much as possible.


回答1:


You can use the bash util wait once you start the process using nohup

nohup java -jar jarfile.jar &
pid=$!     # Getting the process id of the last command executed

wait $pid  # Waits until the process mentioned by the pid is complete
echo "Done, execute the new command"



回答2:


I don't think you're going to get around "polling until you don't see the pid running anymore." wait is a bash builtin; it's what you want and I'm certain that's exactly what it does behind the scenes. But since Inian beat me to it, here's a friendly function for you anyway (in case you want to get a few things running in parallel).

alert_when_finished () {
  declare cmd="${@}";
  ${cmd} &
  declare pid="${!}";
  while [[ -d "/proc/${pid}/" ]]; do :; done; #equivalent to wait
  echo "[${pid}] Finished running: ${cmd}";
}

Running a command like this will give the desired effect and suppress unneeded job output:

( alert_when_finished 'sleep 5' & )


来源:https://stackoverflow.com/questions/36708306/how-to-capture-a-process-id-and-also-add-a-trigger-when-that-process-finishes-in

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!