簡體   English   中英

從嵌入式Linux上的Shell控制多個后台進程

[英]Controlling multiple background process from a shell on an embedded Linux

目前,我正在使用具有Linux OS的嵌入式系統。 我需要同時運行多個應用程序,我希望它們能夠通過一個腳本運行。 一位同事已經通過使用包裝腳本和返回代碼來實現此目的。

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后面有一個換行符(某些應用程序可能需要回車;如果您的shell不太stuff "q$(printf \\\\015)"則可以使用stuff "q$(printf \\\\015)" )。 如果您的命令期望q根本沒有換行符,則只需stuff q

對於日志記錄,可以使用Screen的日志記錄功能,也可以像以前一樣將輸出重定向到文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM