백그라운드에서 원격 서버의 쉘 스크립트 실행

백그라운드에서 원격 서버의 쉘 스크립트 실행

서버 목록과 서버에서 실행해야 하는 Bash 스크립트가 있습니다. 예를 들어, 사용자 지정 명령을 사용하여 서버에서 cronjob을 예약하는 스크립트가 있습니다. 이것은 단지 예일 뿐이며 cronjob 삭제, SSH 키 저장, 데몬 시작을 위한 감독자 구성 등을 위한 스크립트가 있습니다.

저는 SSH를 통해 프로그래밍 방식으로 서버에 연결하고 있으며 원격 서버에서 이 스크립트를 실행하고 싶지만 "백그라운드에서" 실행하고 싶습니다. "백그라운드에서"라고 말하면 실제 스크립트가 실행되는 시점에 대해 걱정하지 않고 코드가 완료되어야 한다는 의미입니다. 이는 내 코드가 차단 언어(PHP)에서 실행되고 일부 스크립트를 실행하는 데 몇 분이 걸릴 수 있기 때문입니다. SSH를 통해 서버에 스크립트를 보내고 실행하고 나머지는 걱정하지 않고 싶습니다. 스크립트 실행이 완료된 후 서버를 컬링합니다(일종의 웹훅과 유사).

로컬 파일 시스템 저장소를 보존하기 위해 각 스크립트는 로컬 서버의 파일에 저장되지 않고 사용자 콘텐츠(cronjob의 경우 명령 및 cron 표현식일 수 있음)로 수정된 후 문자열로 표시됩니다. 예: echo "{{name}}"사용자가 프로그래밍 방식으로 스크립트에 삽입되는 "이름" 변수를 제공하는 스크립트가 있습니다 . 사용자가 제공한 모든 스크립트 수정 사항을 내 파일 시스템에 저장하고 싶지 않습니다.

지금 내가 하는 방법은 내 서버에서 다음 명령을 실행하는 것입니다.

ssh -T user@host /bin/bash <<EOFX\n{{script}}EOFX

이는 쉘 명령을 실행하기 위해 PHP 명령으로 래핑되고 {{script}}다음으로 대체됩니다.

#!/bin/bash

cat << 'EOFY' > ./script.sh
{{executionScript}}
EOFY

. ./script.sh > ./script.out

curl --data "status=$(echo $?)" myserver.com

이 경우 {{executionScript}}서버에서 실행해야 하는 최종 스크립트의 수정된 버전으로 대체됩니다(예 echo "John Doe": ).

지금까지는 제대로 작동했지만 SSH 명령은 스크립트 실행이 완료될 때까지 기다리고 있습니다. sleep 4before 를 추가 하면 curl내 코드(SSH 명령 실행)는 4초 더 기다립니다.

특정 스크립트를 백그라운드에서 실행해야 하는 SSH 명령을 실행하는 방법이 있습니까?

나는 달성하려는 목표에 대한 높은 수준의 개요를 제공했으며 누군가가 내 문제(서버에서 사용자가 수정한 스크립트 집합 실행)에 대한 더 나은 솔루션을 제공할 수 있기를 바랍니다. 나는 이것이 Unix/Linux 보드라는 것을 알고 있으며 내 주요 문제는 스크립트가 완료되기를 기다리는 SSH 명령입니다.

답변1

명령 셸을 사용할 때 명령 앞에 nohup을 추가하면 로그아웃하거나 셸을 종료할 때 명령이 자동으로 중단되는 것을 방지할 수 있습니다.

nohup mycommand &

또는

ssh -n -f user@host "sh -c 'cd /whereever; nohup ./whatever > /dev/null 2>&1 &'"

연결을 끊더라도 계속 실행되어야 합니다.

관련 정보