【发布时间】:2016-02-06 11:59:38
【问题描述】:
我必须编写一个 bash 脚本,根据传递的命令行参数在 background 中启动一个进程,如果它能够成功 run 启动 返回程序。
这是我想要实现的伪代码
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
脚本不能wait 或sleep 因为它将被另一个关键任务c++ 程序调用并且需要高吞吐量(每秒启动的进程数),而且进程的运行时间是未知的。脚本既不需要捕获任何输入/输出,也不需要等待启动的进程完成。
我没有成功尝试以下方法:
#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
运行脚本会产生不可靠的输出。方法 1、2 始终返回 Success,而方法 3 在进程执行在检查之前完成时返回 failed。
这是在GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu) 和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
正如在类似问题中所建议的,我不能使用进程名称,因为不能应用 one process may be executed several times 和 others。
我没有尝试过screen 和tmux,因为获得在生产服务器上安装它们的权限并不容易(但如果这是唯一的选择,我会这样做)
更新
@ghoti./kp 是存在的程序,启动程序返回Success。 ./NoSuchCommand 不存在。从 (edited) 输出中仍然可以看到,脚本错误地返回 Success。
进程何时完成执行或程序异常终止无关紧要。通过脚本启动的程序不会以任何方式被跟踪(因此我们不会将pid 存储在任何表中,也没有必要使用deamontools)。
@Etan Reisner
无法启动的程序示例是./NoSuchCommand,它不存在。或者可能是一个无法启动的损坏程序。
@Vorsprung
调用在后台启动程序的脚本不会花费很多时间(并且可以根据我们的期望进行管理)。但是sleep 1 会随着时间的推移累积而导致问题。
上述#Method3 工作正常,除非进程在ps -eo pid | grep "$PROC_ID" && { echo "Success"; exit 0; } 检查可以执行之前终止。
【问题讨论】:
-
您是否需要测试它们是否仍在运行或是否完全正确运行?如果它们仍在运行,您如何判断它们是否正确运行?以后的失败不重要吗?如果他们开始运行,您是否关心他们是否在某个时候失败?您需要报告哪些具体标准?
-
如果进程启动成功与否,脚本将返回。无需检查它们是否仍在运行或稍后异常终止。
-
这些程序在什么情况下无法启动?如果以后失败无关紧要,这是一个现实的担忧吗?
-
@parthasarathy - 请update your question 提供这些详细信息。评论是 cmets 的好地方。
-
另外,
./kp和./NoSuchCommand真的存在吗?或者这就是你真正想要测试的?