I have to write a bash script that launches a process in background in accordance to command line argument passed and returns if it were successfully able to run launch the program.
Here is a pseudo code of what I am trying to achieve
if [ "$1" = "PROG_1" ] ; then
./launchProg1 &
if [ isLaunchSuccess ] ; then
echo "Success"
else
echo "failed"
exit 1
fi
elif [ "$1" = "PROG_2" ] ; then
./launchProg2 &
if [ isLaunchSuccess ] ; then
echo "Success"
else
echo "failed"
exit 1
fi
fi
Script cannot wait
or sleep
since it will be called by another mission critical c++ program and needs high throughput ( wrt no of processes started per second ) and moreover running time of processes are unknown. Script neither needs to capture any input/output nor waits for launched process' completion.
I have unsuccessfully tried the following:
#Method 1
if [ "$1" = "KP1" ] ; then
echo "The Arguement is KP1"
./kp 'this is text' &
if [ $? = "0" ] ; then
echo "Success"
else
echo "failed"
exit 1
fi
elif [ "$1" = "KP2" ] ; then
echo "The Arguement is KP2"
./NoSuchCommand 'this is text' &
if [ $? = "0" ] ; then
echo "Success"
else
echo "failed"
exit 1
fi
#Method 2
elif [ "$1" = "CD5" ] ; then
echo "The Arguement is CD5"
cd "doesNotExist" &
PROC_ID=$!
echo "PID is $PROC_ID"
if kill -0 "$PROC_ID" ; then
echo "Success"
else
echo "failed"
exit 1
fi
#Method 3
elif [ "$1" = "CD6" ] ; then
echo "The Arguement is CD6"
cd .. &
PROC_ID=$!
echo "PID is $PROC_ID"
ps -eo pid | grep "$PROC_ID" && { echo "Success"; exit 0; }
ps -eo pid | grep "$PROC_ID" || { echo "failed" ; exit 1; }
else
echo "Unknown Argument"
exit 1
fi
Running the script gives unreliable output. Method 1, 2 always return Success
while Method 3 returns failed
when process execution finishes before the checks.
Here is sample tested on GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
and GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
[scripts]$ ./processStarted3.sh KP1
The Arguement is KP1
Success
[scripts]$ ./processStarted3.sh KP2
The Arguement is KP2
Success
./processStarted3.sh: line 13: ./NoSuchCommand: No such file or directory
[scripts]$ ./processStarted3.sh CD6
The Arguement is CD6
PID is 25050
failed
As suggested in similar questions, I cannot use process names as one process may be executed several times and others can't be applied.
I have not tried screen and tmux, since getting permission to install them on production servers wont be easy ( but will do so if that is the only option left )
UPDATE
@ghoti
./kp
is program which exists and launching the program returns Success
. ./NoSuchCommand
does not exist. Still as you can see from (edited) output, script incorrectly returns Success
.
It does not matter when the process completes execution or program abnormally terminates. Programs launched via script are not tracked in any way ( hence we do not store pid
in any table nor necessity arises to use deamontools
).
@Etan Reisner
Example of a program which fails to launch will be ./NoSuchCommand
,which does not exist. Or maybe a corrupted program which fails to start.
@Vorsprung
Calling a script which launches a program in background does not take alot of time ( and is manageable as per our expectations). But sleep 1
will accumulate over time to cause issues.
Aforementioned #Method3
works fine barring processes which terminate before ps -eo pid | grep "$PROC_ID" && { echo "Success"; exit 0; }
check can be performed.