如何在后台运行长度和耗时的过程?

如何在后台运行长度和耗时的过程?

我正在开发一个 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,,bgjobs意思是在后台添加这个进程。但是当我断开 ssh 并重新连接时,我无法在jobsandbg命令中找到该进程。

我也尝试添加这个过程,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 将要执行的脚本。

相关内容