Shooting myself in the foot by using exec
in a shell script
Once upon a time, we needed a simple shell script that did some setup stuff and then ran a program that did all of the work; this shell script was going to run from crontab once a day. Because I'm sometimes very me, I bummed the shell script like so:
#!/bin/sh setup yadda exec realprog --option some-args
Why not use exec
? After all, it's one less process, even if it
doesn't really matter.
Later, we needed to run the program a second time with some different arguments, because we'd added some more things for it to process. So we updated the script:
#!/bin/sh setup yadda exec realprog --option some-args exec realprog --switch other-args
Yeah, there's a little issue here. It probably looks obvious written
up here, but I was staring at this script just last week, knowing
that for some reason it hadn't generated the relatively infrequent
bit of email we'd expected, and I didn't see it then; my eyes and
my mind skipped right over the implications of the repeated exec
.
I only realized what I was seeing today, when I took another, more
determined look and this time it worked.
(The implication is that anything after the first exec
will never
get run, because the first exec
replaces the shell that's running
the shell script with realprog
.)
This was a self-inflicted injury. The script in no way needed the
original exec
; putting it in there anyway in the name of a trivial
optimization led directly to the error in the updated script. If I
hadn't tried to be clever, we'd have been better off.
(I'm not going to call this premature optimization, because it wasn't. I wasn't trying to optimize the script, not particularly; I was just being (too) clever and bumming my shell script for fun because I could.)
PS: In the usual way of things, I felt silly for not having spotted
the repeat exec
issue last week. But we see what we're looking
for, and I think that last week my big question before I checked the
script was 'have we updated the script to work on the other-args'. We
had a line to run the program on them, so the answer was 'yes' and I
stopped there. Today I knew things had once again not happened, so I
asked myself 'what on earth could be stopping the second command from
running?' and the light suddenly dawned.
|
|