![如何在后台运行长度和耗时的过程?](https://linux22.com/image/187951/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C%E9%95%BF%E5%BA%A6%E5%92%8C%E8%80%97%E6%97%B6%E7%9A%84%E8%BF%87%E7%A8%8B%EF%BC%9F%20.png)
我正在开发一个 Magento 2 项目,其中包含大量数据 ~10GB 数据库 + ~1GB 代码 + ~5GB 媒体。
我想在我的本地服务器上设置它。所以我想用数据库压缩整个项目。
我尝试使用此命令创建数据库备份
# mysqldump -u magento2_user -p magento2_db > magento2_db-20201110.sql
创建数据库备份需要半天 ~6 小时,在此过程中,我的 sh 连接得到支持,因此我需要重新创建备份。
现在,我有了更好的策略备份命令。
website:
tar -czvf ~/multi_dump.tar.gz --exclude=var/cache --exclude=var/session --exclude=var/log --exclude=var/tmp --exclude=var/export --exclude=var/report --exclude=var/backups --exclude='media/*import*' --exclude=media/tmp --exclude=media/downloadable --exclude=media/catalog . && echo OK
database:
mysqldump --single-transaction --add-drop-table -h <host> -u <user> -p <db_name> | gzip > dump.sql.gz
这是一项非常漫长且耗时的任务。
因此,我正在寻找一种在后台自动过程创建数据库备份的方法。
我被发现了Ctrl+Z
,,bg
。jobs
意思是在后台添加这个进程。但是当我断开 ssh 并重新连接时,我无法在jobs
andbg
命令中找到该进程。
我也尝试添加这个过程,crontab -e
但我还没有访问它。
那么,有人有更好的解决方案来解决这个问题吗?
这是操作系统细节。
答案1
tmux(或 screen)确实是一个不错的解决方案,但它需要一个额外的包。
使用nohup
(如 Panki 所建议的)可能是 *nix 世界中可移植性的最佳解决方案。然而,ubuntu 16 附带了 systemd,那么你可以使用systemd-run
启动命令:
systemd-run --unit=my_backup --remain-after-exit mysqldump --single-transaction --add-drop-table -h <host> -u <user> -p <db_name> -r magento2_db-20201110.sql
然后,您可以使用常规 systemd 命令访问状态和输出:
journalctl -b -u my_backup
systemctl status my_backup
您甚至可以通过额外的 systemd-run 选项轻松限制备份使用的资源,参见man 1 systemd 运行。
一些解释:
--remain-after-exit
即使 mysqldump 完成后也需要保留 my_backup.service 以便查询服务状态和日志(通过journalctl)--unit
允许根据您希望的名称命名由 systemd-run 启动的服务- 我使用 mysqldump 选项
-r
来避免标准输出重定向。
使用 systemd-run 启动任何命令都可以关闭远程 ssh 访问,而无需终止该命令。
答案2
您可以尝试从一开始就在后台运行该过程。
$ nohup mysqldump -u magento2_user -p magento2_db > magento2_db-20201110.sql &
nohup
使人免受挂断的影响。意味着在您的终端或 ssh 会话关闭后,该过程将在后台继续。并通过&
在命令中添加您所说的 shell 来在后台运行它。
如果您想跟踪运行命令时可能发生的任何错误,那么您也可以添加它
$ nohup mysqldump -u magento2_user -p magento2_db > magento2_db-20201110.sql 2>error.log &
这2>error.log
意味着stderr
您正在运行的进程将被重定向到该error.log
文件。
答案3
安装终端多路复用器,例如多路复用器可以是一个选择吗?
您登录到服务器:
ssh user@srv
然后启动tmux:
tmux new -s main
当您打开与远程服务器的另一个连接时,您的 tmux 会话仍然存在:
tmux -a t main
编辑
我已经尝试过这个并且它有效:
cat .foo.sh
#!/bin/bash
while [ 1 ]; do echo "OK"; sleep 120; done;
chmod +x .foo.sh
trap './foo.sh &' exit
# exit from ssh session
exit
现在再次登录:
ssh user@srv
ps -U $USER -o cmd,pid | grep "foo"
/bin/bash ./foo.sh 3099
实质上陷阱命令在收到退出信号时调用脚本。当然你需要把你的mysql转储cmd 将要执行的脚本。