目前我正在使用具有Linux操作系统的嵌入式系统。我需要同时运行多个应用程序,我希望它们能够运行一个脚本。一位同事已经通过使用包装器脚本和返回代码实现了这一点。
wrapperScript.sh $command & > output_log.txt
wrapperScript.sh $command2 & >output_log2.txt
但问题出现在退出应用程序时。通常,嵌入式系统上的所有应用程序都要求用户按q
退出。但是包装脚本而不是在获取kill信号或用户信号时这样做,它只会杀死进程。这很危险,因为包装器脚本假定应用程序具有处理kill信号的适当工具(情况并非总是如此,并导致内存泄漏和不需要的套接字连接)。我已经研究过自动化程序,例如期望,但由于我使用的是嵌入式主板,我无法对它产生期望。有没有办法在bash shell或者嵌入式C中处理多个进程,让一个程序自动将q
信号发送给程序。
我还希望能够维护日志和文件输出。
编辑:
解决方案:
好的,我发现了问题的问题,Expect是在任何情况下都可以解决的问题。有一个严重的限制,它可能会变慢,但在这种情况下,权衡并不坏。我决定使用Expect Scripting Language来实现该解决方案。有一定的权衡。
优点: *精确控制嵌入式应用程序 *可以使用户进行交互 *可以处理多个流程
缺点: *表现缓慢
答案 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
。
对于日志记录,您可以使用屏幕的日志记录功能,或者像以前一样将输出重定向到文件。