假设我在 PuTTY 连接中启动
mysqldump --host host1 --databases db1 db2 db3 | mysql
它创建了两个进程:mysqldump
PID 为 5800 和mysql
PID 为 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
如何处理两个并行运行的进程?
有很多可能的答案,使用或不使用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
......