On 15/06/11 04:27, Michael Dale wrote:
For the TimedMediaHandler I was adding more fine grain
control over
background processes [1] and ran into a unix issue around getting both a
pid and exit status for a given background shell command.
Essentially with a background task I can get the pid or the exit status
but can't seem to get both:
to get the pid:
$pid = wfShellExec("nohup nice -n 19 $cmd > /tmp/stdout.log & echo $!";
put the exit status into a file:
$pid = wfShellExec("nohup nice -n 19 $cmd > /tmp/stdout.log && echo $?
>
/tmp/exit.status";
But if I try to get both either my exit status is for the "echo pid"
command or my pid is for the "echo exit status" command. It seems like
there should be some shell trick back-reference background tasks or
something
Maybe something like:
#!/bin/bash
trap 'kill %1' SIGINT SIGTERM
(
$cmd > /tmp/stdout.log
echo $? > /tmp/exit.status
) &
subshell="$!"
cmdpid=
# Wait for the command to start
for i in `seq 100`;do
cmdpid=`ps --ppid "$subshell" -o pid --no-headers`
if [ -n "$cmdpid" ]; then
break
fi
sleep 0.1
done
# Return the PID to MediaWiki
echo "$cmdpid"
There comes a point with every shell script project where you realise
it would have been easier to use a real programming language from the
start. In this case, doing it in PHP with pcntl_fork(), pcntl_exec()
and pcntl_wait() would be a reasonable solution. In my experience, you
can't ask the question "how do I do X in shell script" and expect to
like the answer.
-- Tim Starling