
假設我在 PuTTY 連線中啟動
mysqldump --host host1 --databases db1 db2 db3 | mysql
它創建了兩個進程:mysqldump
PID 5800 和mysql
PID 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
如何處理兩個並行運行的進程?
有很多可能的答案,使用或不使用工具screen
,tmux
或作為後台任務運行,使用單獨的日誌檔案...
分別運行兩個進程
你可以使用命名為先進先出:
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
...中的文件