如何處理兩個並行運行的進程?

如何處理兩個並行運行的進程?

假設我在 PuTTY 連線中啟動

mysqldump --host host1 --databases db1 db2 db3 | mysql

它創建了兩個進程:mysqldumpPID 5800 和mysqlPID 5801。

我在這裡找到了一些處理單一進程以及如何將reptyr其重新設定為父進程的答案screen,但我關心的是如何處理並行運行的兩個進程。

答案1

讓您繁忙的會話繼續運行。

開啟另一個新會話。

使用tmux該應用程序,即使您關閉或丟失 ssh 連接,該應用程式也將持續存在。與tmux類似screen,可以說是更好一點。

sudo apt install tmux
tmux

現在是關鍵的一步,竊取進程的終端。

sudo apt install reptyr
ps uw    # find one of the PIDs to save, any will do
reptyr -T the_PID

我注意到一個副作用該方法的reptyr -T。您也可以在執行的應用程式中捕獲舊的 shell。如果exit現在,您將返回 tmux/screen 的原始 shell。再次使用exit,您將返回登入 shell。

答案2

如何處理兩個並行運行的進程?

有很多可能的答案,使用或不使用工具screentmux或作為後台任務運行,使用單獨的日誌檔案...

分別運行兩個進程

你可以使用命名為先進先出

mkfifo $HOME/mysqlFifo

然後分兩路跑終端安慰:

mysqldump --host host1 --databases db1 db2 db3 >$HOME/mysqlFifo

在第二個視窗中:

mysql <$HOME/mysqlFifo

然後讓它運行...

我想關閉 PuTTY 並且稍後仍能返回它們嗎?

screen

一些準備:

cat >$HOME/mysqlScreenRc <<eof
screen -t dump mysqldump --host host1 --databases db1 db2 db3 >$HOME/mysqlFifo
screen -t mysql mysql <$HOME/mysqlFifo
eof
mkfifo $HOME/mysqlFifo

然後

screen -S mysql -c $HOME/mysqlScreenRc

或者

screen -dmS mysql -c $HOME/mysqlScreenRc

讓它在背景運行...

然後連接並觀看:

screen -r mysql

為了確保命令終止後螢幕保持開啟狀態,您可以使用read命令:

cat >$HOME/mysqlScreenRc <<eof
screen -t dump sh -c 'mysqldump --host host1 --databases db1 db2 db3 >$HOME/mysqlFifo;read foo'
screen -t mysql sh -c 'mysql <$HOME/mysqlFifo;read foo'
eof

但你可以在背景運行,並使用單獨的日誌:

nohup mysqldump --host host1 --databases db1 db2 db3 2>/somepath/mysqldump.err |
    mysql >/somepath/mysql.log 2>/somepath/mysql.err &

所以你可以關閉這個控制台,然後查看/somepath...中的文件

相關內容