从嵌入式Linux上的shell控制多个后台进程

时间:2011-10-24 19:29:08

标签: linux automation embedded

目前我正在使用具有Linux操作系统的嵌入式系统。我需要同时运行多个应用程序,我希望它们能够运行一个脚本。一位同事已经通过使用包装器脚本和返回代码实现了这一点。

wrapperScript.sh $command & > output_log.txt
wrapperScript.sh $command2 & >output_log2.txt

但问题出现在退出应用程序时。通常,嵌入式系统上的所有应用程序都要求用户按q退出。但是包装脚本而不是在获取kill信号或用户信号时这样做,它只会杀死进程。这很危险,因为包装器脚本假定应用程序具有处理kill信号的适当工具(情况并非总是如此,并导致内存泄漏和不需要的套接字连接)。我已经研究过自动化程序,例如期望,但由于我使用的是嵌入式主板,我无法对它产生期望。有没有办法在bash shell或者嵌入式C中处理多个进程,让一个程序自动将q信号发送给程序。

我还希望能够维护日志和文件输出。

编辑:

解决方案:

好的,我发现了问题的问题,Expect是在任何情况下都可以解决的问题。有一个严重的限制,它可能会变慢,但在这种情况下,权衡并不坏。我决定使用Expect Scripting Language来实现该解决方案。有一定的权衡。

优点: *精确控制嵌入式应用程序 *可以使用户进行交互 *可以处理多个流程

缺点: *表现缓慢

1 个答案:

答案 0 :(得分:1)

使用管道

使命令从命名管道读取输入。然后,您就可以从任何地方发送命令。

mkfifo command1.ctrl
{ "$command1" <command1.ctrl >command1.log 2>&1;
  rm command1.ctrl; } &

使用屏幕

Screen程序中运行您的应用程序。您可以在单个屏幕实例中的不同窗口中运行所有命令(这样可以节省一点内存)。您可以指定要从屏幕配置文件运行的命令:

sessionname mycommands
screen -t command1 command1
screen -t command2 command2

要终止程序,请使用

screen -S mycommands -p 1 -X stuff 'q
'

其中1是发送输入的窗口号(配置文件中的每个screen子句启动一个窗口)。输入stuff后的文本发送给程序;请注意q之后是否存在换行符(某些应用程序可能需要回车;如果您的shell不太功能,则可以使用stuff "q$(printf \\015)"获得一个换行符)。如果您的命令期望q完全没有换行符,只需stuff q

对于日志记录,您可以使用屏幕的日志记录功能,或者像以前一样将输出重定向到文件。