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

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

但是当退出应用程序时会出现问题。通常,嵌入式系统上的所有应用程序都需要用户按q退出。但是包装器脚本并没有在收到kill信号或用户信号时那样做,它只是终止进程。这是危险的,因为包装器脚本假定应用程序有适当的工具来处理kill信号(并非总是这样,这会导致内存泄漏和不需要的套接字连接)。我曾研究过expect这样的自动化程序,但由于我使用的是嵌入式电路板,所以我无法对它抱有期望。在bash shell或嵌入式c中有没有一种方法可以处理多个进程,让一个程序自动向程序发送q信号。
我也希望能够维护日志和文件的输出。
编辑:
解决方案:
好吧,我找到了问题的症结所在,期望是在任何情况下解决问题的方法。有一个严重的限制,它可能会放缓,但在这种情况下,取舍并不坏。我决定使用expect脚本语言来实现这个解决方案。有一定的取舍。
赞成的意见:
*嵌入式应用的精确控制
*可以使进程与用户交互
*可以处理多个进程
欺骗:
*表现很慢

最佳答案

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

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

使用屏幕
Screen程序中运行应用程序。您可以在单独一个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
对于日志记录,您可以使用屏幕的日志记录功能,或者像以前一样将输出重定向到文件。

关于linux - 从嵌入式Linux上的Shell控制多个后台进程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7880861/

10-13 02:50