为何用nohup&启动MySQL导入命令,关闭终端仍会中断?
问题原因
- 进程组未彻底脱离终端:你用
nohup ... &把mysql进程放到后台后,它仍属于当前终端shell的进程组。当终端关闭时,父shell会向整个进程组发送SIGHUP终止信号,mysql进程收到信号后直接中断了导入操作。 -e参数嵌套命令的限制:通过mysql -e执行嵌套的SOURCE命令时,mysql客户端内部的导入操作没有完全和终端的信号处理机制隔离,终端一旦断开,客户端就会响应信号终止任务。- MySQL 5.7客户端的信号特性:MySQL 5.7的客户端不会忽略SIGHUP信号,不像Python/Java程序通常会屏蔽这类终端断开信号,它收到信号后直接中止正在执行的查询,所以出现了
Terminal close -- query aborted的提示。
解决办法
- 通过标准输入直接导入SQL文件:避免用
-e嵌套命令,改用重定向方式让mysql直接读取文件内容,这种方式能更好地脱离终端关联:
记得在nohup mysql -D bi < bi-6.sql &bi-6.sql开头加上SET autocommit=0;,结尾加上COMMIT;来保持事务批量提交的特性。 - 用
disown剥离进程组:先执行导入命令放到后台,再立即用disown把进程从shell进程组移除,这样终端关闭时进程不会收到终止信号:mysql -D bi -e "SET autocommit=0; SOURCE bi-6.sql; COMMIT;" & disown -h %1 - 使用会话管理工具:用
screen或tmux创建独立会话,在会话内执行导入命令,之后detach会话即可关闭终端,后续可以重新连接会话查看导入进度,适合长时间运行的任务。
内容的提问来源于stack exchange,提问作者djy
相关产品推荐
相关产品推荐

