gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:37:16 25 4
gpt4 key购买 nike

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

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

但是问题出现在退出应用程序的时候。通常,嵌入式系统上的所有应用程序都需要用户按 q 退出。但是包装器脚本在收到终止信号或用户信号时并没有这样做,而是终止了进程。这是危险的,因为包装器脚本假定应用程序具有处理终止信号的适当设施(情况并非总是如此,并会导致内存泄漏和不需要的套接字连接)。我已经研究过诸如 expect 之类的自动化程序,但由于我使用的是嵌入式板,因此我无法对它进行期望。在 bash shell 或嵌入式 C 中有没有一种方法可以处理多个进程,让一个程序自动向程序发送 q 信号。

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

编辑:

解决方法:

好的,我找到了问题的关键,Expect 是在任何情况下解决问题的方法。有一个严重的限制,它可能会变慢,但在这种情况下权衡也不错。我决定使用 Expect 脚本语言来实现该解决方案。有一定的折衷。

优点:* 对嵌入式应用的精确控制* 可以使过程与用户交互* 可以处理多进程

缺点:* 性能较慢

最佳答案

使用管道

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

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 之后的换行符(某些应用程序可能需要回车;您可以使用 stuff "q$(printf\\015)"你的 shell 不是太缺乏特色)。如果您的命令需要一个完全没有换行符的 q,只需 stuff q

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com