如何处理两个并行运行的进程?

如何处理两个并行运行的进程?

假设我在 PuTTY 连接中启动

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

它创建了两个进程:mysqldumpPID 为 5800 和mysqlPID 为 5801。当我想关闭 PuTTY 时,是否可以让正在运行的进程继续执行,并且稍后仍然能够返回到它们?

我在这里找到了一些处理单个进程以及如何使用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......

相关内容