완료를 기다리지 않고 원격 서버에서 bash 실행

완료를 기다리지 않고 원격 서버에서 bash 실행

서로 다른 서버에서 동시에 서로 다른 스크립트를 실행하고 싶습니다. (+/- 2초는 문제 없습니다.) 조건은 Cron 일정을 통하지 않고 마스터 서버의 호출을 통해 스크립트를 시작하는 것입니다. SSH를 시도했지만 그렇게 하면 세션을 삭제하기 전에 원격 서버에서 스크립트 실행이 끝날 때까지 기다려야 합니다. 저는 스크립트가 끝날 때까지 기다리지 않고 원격 서버에서 스크립트를 시작할 수 있는 대안을 찾고 있습니다. 추신 - 내 사용 사례에서는 CLI를 사용하지 않고 외부 스크립트를 사용하여 기본 서버에서 스크립트를 트리거하는 애플리케이션을 호출하고 있습니다. 감사해요.

답변1

GNU를 사용하면 시스템 이 로그아웃 시 모든 프로세스를 종료 screen하지 않는 한 서버에 대한 연결을 유지하지 않고도 원격 작업을 수행할 수 있습니다 . 구체적으로 다음을 사용할 수 있습니다.systemd

#!/bin/sh
ssh server1 screen -d -m command1
ssh server2 screen -d -m command2
# ...

각 로컬 ssh세션은 screen원격 프로세스를 시작한 직후 종료되며, 원격 프로세스는 실행된 명령이 완료된 후 즉시 종료됩니다. ssh각 줄 뒤에 접미사를 추가하여 병렬 연결을 만들 수 &있습니다.

매뉴얼에서 발췌 screen(1):

-d -mscreen"분리" 모드에서 시작합니다. 그러면 새 세션이 생성되지만 연결되지는 않습니다. 이는 시스템 시작 스크립트에 유용합니다.


1 시스템이 를 systemd사용하여 구성된 경우 이를 으로 killUserProcesses=yes교체해야 합니다 .screensystemd-run --user --scope screen

답변2

나중에 거부되는 하위 쉘에 명령을 보내려면 "& disown"을 사용하십시오. 프로세스 추적이 필요한 경우 nohup을 사용하세요. 제가 아래에서 사용하는 것은바이너리가 래핑되어 있습니다.시간무슨 일이 일어나고 있는지 콘솔에서 빠른 피드백을 제공하기 위해 호출되었습니다.

time sleep 5

쉘이 차단 중이므로 세션을 제대로 종료할 수 없습니다.

time sleep 5 &

껍질이 벗겨졌으니 종료하세요그래도 사람을 죽일 거야수면 명령.

time nohup sleep 5 &

이 서브셸은 nohup이므로 로깅으로 인해 더 나은 작업을 수행할 수 있지만 서브셸은 이를 생성한 셸에 계속 연결되므로 세션이 종료되면 서브셸과 해당 프로세스가 삭제됩니다. 당신은 정말로 그것을 거부해야 합니다:

#!/bin/bash

nohup sleep 500 & disown
pid=$!
echo $pid > /tmp/time.pid
exit 0

관련 정보