長くて時間のかかるプロセスをバックグラウンドで実行する方法は? [コピー]

長くて時間のかかるプロセスをバックグラウンドで実行する方法は? [コピー]

私は、〜10 GBのデータベース+〜1 GBのコード+〜5 GBのメディアで構成される多くのデータを含むMagento 2プロジェクトを進めています。

私のローカルサーバーに設定したいです。だから私はデータベースを使用してプロジェクト全体を圧縮したいと思います。

このコマンドを使用してデータベースバックアップを作成しようとしています。

# 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を切断して再接続すると、jobsandコマンドでbgプロセスが見つかりません。

また、このプロセスを追加しようとしましたが、crontab -eまだアクセスできません。

それでは、この問題に対するより良い解決策を持っている人はいますか?

オペレーティングシステムの詳細です。

オペレーティングシステムの詳細

答え1

tmux(またはscreen)は実際には良いソリューションですが、追加のパッケージが必要です。

Pankiが提案したように使用するのは、nohupおそらく* 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オプションを使用すると、バックアップに使用されるリソースを簡単に制限できます。男1システム実行

いくつかの説明:

  • --remain-after-exitmy_backup.service は、 mysqldump が完了した後も維持される必要があるサービスの状態とログを照会できます (journalctl を介して)。
  • --unitsystemd-runで開始されたサービスを必要に応じて名前を付けることができます。
  • -r標準出力リダイレクトを避けるために mysqldump オプションを使用します。

systemd-run で始まるすべてのコマンドは、コマンドを終了せずにリモート SSH アクセスをオフにできます。

答え2

最初からバックグラウンドでプロセスを実行してみることができます。

$ nohup mysqldump -u magento2_user -p magento2_db > magento2_db-20201110.sql &

nohup絶え間ない現象から人を守りましょう。これは、端末またはSSHセッションが閉じた後もプロセスがバックグラウンドで続行されることを意味します。&シェルと呼ばれるものをコマンドに追加してバックグラウンドで実行します。

コマンドの実行中に発生する可能性のあるエラーを追跡するには、それを追加することもできます。

$ nohup mysqldump -u magento2_user -p magento2_db > magento2_db-20201110.sql 2>error.log & 

これは、実行中のプロセスがこのファイルにリダイレクトされることを意味します2>error.logstderrerror.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 で実行するスクリプトです。

関連情報