분리 모드에서 screen을 사용하여 bash 스크립트를 실행하는 방법은 무엇입니까?

분리 모드에서 screen을 사용하여 bash 스크립트를 실행하는 방법은 무엇입니까?

다음 내용으로 bash 스크립트를 만들었습니다.

#!/bin/bash
screen -dmS xccda "$(cd /root/constella && ./daemon.sh)"
screen -dmS xccwa "$(cd /root/constella && ./wallet.sh)"
screen -dmS xprda "$(cd /root/Prosus_Money && ./daemon.sh)"
screen -dmS xprwa "$(cd /root/Prosus_Money && ./wallet.sh)"
screen -dmS litda "$(cd /root/LithiumBit/build/release/src && ./daemon.sh)"
screen -dmS litwa "$(cd /root/LithiumBit/build/release/src && ./wallet.sh)"
screen -dmS lukada "$(cd /root/luka/cryptonote/build/release/src && ./daemon.sh)"
screen -dmS lukawa "$(cd /root/luka/cryptonote/build/release/src && ./wallet.sh)"
screen -dmS chaucha "$(cd /root/daemons/ && ./chauchad)"
screen -dmS litecoin "$(cd /root/daemons/litecoin-0.15.1/src && ./litecoind)"

내가 원하는 것은 이 스크립트가 스크린 세션에서 이러한 스크립트를 실행하는 것입니다. 하지만 스크립트를 실행하거나 sh main.sh스크린 ./main.sh세션을 열지 않으면 이런 일이 발생합니다.

./main sh를 실행했는데 아무것도 표시되지 않고 스크립트가 끝나지 않습니다.

개별적으로 실행하면 각 쉘 스크립트는 다음과 같이 실행됩니다.

꽤 잘 돌아간다 :c

답변1

스크립트의 처음 몇 줄부터 시작하겠습니다. 이 질문은 모든 질문에 영향을 미치지만 여기서 하나만 다루는 것이 더 쉽습니다.

#!/bin/bash
screen -dmS xccda "$(cd /root/constella && ./daemon.sh)"

bash스크립트 로 선언한 경우 sh이를 실행하는 데 사용하지 마십시오. 권한을 설정하고 실행하거나 ./main.sh올바른 쉘을 사용하십시오 bash main.sh.

이제 스크립트가 정지된 것처럼 보이는 이유는 무엇입니까? 세션에는 screen큰따옴표로 묶인 문자열이 전달됩니다. 간단히 말해서 이는 쉘이 로 시작하는 표현식과 변수를 평가할 수 있음을 의미합니다 $. $( ... )쉘이 내용을 실행하고 전체 문자열을 작성한 결과로 바꾸도록 지시하는 지시문을 포함시켰습니다.표준 출력. 분명히 대체가 발생하려면 명령이 완료되어야 합니다. 하지만 당신의 것은 그렇지 않습니다. 또한 어쨌든 출력을 원하지 않습니다.

즉,

  1. 올바른 쉘 인터프리터를 사용하십시오
  2. 여기서는 큰따옴표를 사용하지 마십시오. 작은따옴표를 사용하면 쉘이 내용을 구문 분석하지 않습니다.
  3. 명령을 평가하고 그 출력을 사용하려고 하지 마십시오. 그냥 실행하세요.

이는 수정된 스크립트의 시작 부분입니다. 전체적으로 유사한 변경 사항을 적용해야 합니다.

#!/bin/bash
screen -dmS xccda 'cd /root/constella && ./daemon.sh'

답변2

screen -dmS xccda bash -c 'cd /root/constella && ./daemon.sh'

관련 정보