SteveKier
SteveKier

Reputation: 61

cron invokes bash script which invokes "script" to run python program. Next line of bash script runs immediately, before script/python completes

When I run the following bash script via cron, the last line runs before the prior line has completed. Why? And how can I enforce the order I want?

I'm convinced that cron is the culprit here somehow, but for the sake of argument, here's a dummy bash script (Obviously, this is just an illustration. In the real world I'm doing some work in the python program and then trying to copy its work product to another place after it's done.):

#!/usr/bin/env bash

cd /tmp/kier/script
script output -c "./sleeper.py; echo '...and we are done'"
echo "This is the next line after invoking script..."

...and for completeness, here's the python script, sleeper.py:

#!/usr/bin/env python3

import time

print("python program starting")
time.sleep(5)
print("python program done")

When I run the bash script from the command line all is well. Specifically, the "This is the next line..." text prints at the very end, after the 5-second sleep.

But when I run it from cron, the output comes in the wrong order (this is the email that comes to me after cron runs the job):

Script started, file is output
Script done, file is output
This is the next line after invoking script...
python program starting
python program done
...and we are done
Script started, file is output

So you can see that "This is the next line..." prints before the python script has even really started. As though it's running the python script in background or something.

I'm stumped. Why is this happening and how can I make the echo command wait until script has finished running the python program?

(Finally, Yes, I could include my extra command inside the commands I send to script, and I am actually considering that. But come on! This is nuts!)

Upvotes: 1

Views: 80

Answers (1)

SteveKier
SteveKier

Reputation: 61

I should follow up and share the solution I came up with. In the end I never got a good answer to WHY it is behaving this way in my (RedHat) environment, so I settled on a workaround. I...

  • created a sentinel file before invoking "script",
  • included an extra command deleting the sentinel file in the script's command text, and then
  • waited for the sentinel file to go away before continuing.

Like this:

sentinel=`mktemp`
script output -c "./sleeper.py; rm $sentinel"
while [ -f $sentinel ]
do
    sleep 3
done

Yes, it's a hack, but I needed to move on.

Upvotes: 1

Related Questions