並行して実行される 2 つのプロセスをどのように処理しますか?

並行して実行される 2 つのプロセスをどのように処理しますか?

PuTTY接続で開始するとします

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

mysqldumpこれにより、 PID 5800 とPID 5801 の2 つのプロセスが作成されます。PuTTYmysqlを閉じて後で戻れるようにしたいときに、実行中のプロセスの実行を継続させることは可能ですか?

ここで、単一のプロセスを扱い、 を使用してreptyrそれを に再親化する方法についての回答をいくつか見つけましたscreenが、私の懸念は、並行して実行される 2 つのプロセスをどのように処理するかということです。

答え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。実行中のアプリとともに古いシェルもキャッチします。これでexit、tmux/screen の元のシェルに戻ります。exitもう一度使用すると、ログイン シェルに戻ります。

答え2

並行して実行される 2 つのプロセスをどのように処理しますか?

screen使用するかどうか、tmuxツールを使用するか、バックグラウンド タスクとして実行するか、分離されたログ ファイルを使用するかなど、考えられる答えはたくさんあります...

2つのプロセスを別々に実行する

使用できる名前付き fifo:

mkfifo $HOME/mysqlFifo

次に2回に分けて実行するターミナルコンソール:

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

2番目のウィンドウでは:

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...

関連情報