길고 시간이 많이 걸리는 프로세스를 백그라운드에서 실행하는 방법은 무엇입니까? [복사]

길고 시간이 많이 걸리는 프로세스를 백그라운드에서 실행하는 방법은 무엇입니까? [복사]

저는 ~10GB 데이터베이스 + ~1GB 코드 + ~5GB 미디어로 구성된 많은 데이터를 포함하는 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,, bg. jobs이는 이 프로세스를 백그라운드에 추가하는 것을 의미합니다. 하지만 ssh 연결을 끊었다가 다시 연결하면 jobsand 명령에서 bg프로세스를 찾을 수 없습니다 .

또한 이 프로세스를 추가하려고 시도했지만 crontab -e아직 액세스할 수 없습니다.

그렇다면 이 문제에 대한 더 나은 해결책을 갖고 있는 사람이 있나요?

운영체제 세부정보입니다.

운영 체제 세부정보

답변1

tmux(또는 screen)는 실제로 좋은 솔루션이지만 추가 패키지가 필요합니다.

Panki가 제안한 대로 사용하는 것이 nohup아마도 *nix 세계에서 이식성을 위한 최상의 솔루션일 것입니다. 그러나 우분투 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.log의미입니다 .stderrerror.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로 실행할 스크립트입니다.

관련 정보