目前,我正在与一个嵌入式系统,有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/