![분리 모드에서 screen을 사용하여 bash 스크립트를 실행하는 방법은 무엇입니까?](https://linux55.com/image/11910/%EB%B6%84%EB%A6%AC%20%EB%AA%A8%EB%93%9C%EC%97%90%EC%84%9C%20screen%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%8B%A4%ED%96%89%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
다음 내용으로 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
세션을 열지 않으면 이런 일이 발생합니다.
개별적으로 실행하면 각 쉘 스크립트는 다음과 같이 실행됩니다.
답변1
스크립트의 처음 몇 줄부터 시작하겠습니다. 이 질문은 모든 질문에 영향을 미치지만 여기서 하나만 다루는 것이 더 쉽습니다.
#!/bin/bash screen -dmS xccda "$(cd /root/constella && ./daemon.sh)"
bash
스크립트 로 선언한 경우 sh
이를 실행하는 데 사용하지 마십시오. 권한을 설정하고 실행하거나 ./main.sh
올바른 쉘을 사용하십시오 bash main.sh
.
이제 스크립트가 정지된 것처럼 보이는 이유는 무엇입니까? 세션에는 screen
큰따옴표로 묶인 문자열이 전달됩니다. 간단히 말해서 이는 쉘이 로 시작하는 표현식과 변수를 평가할 수 있음을 의미합니다 $
. $( ... )
쉘이 내용을 실행하고 전체 문자열을 작성한 결과로 바꾸도록 지시하는 지시문을 포함시켰습니다.표준 출력. 분명히 대체가 발생하려면 명령이 완료되어야 합니다. 하지만 당신의 것은 그렇지 않습니다. 또한 어쨌든 출력을 원하지 않습니다.
즉,
- 올바른 쉘 인터프리터를 사용하십시오
- 여기서는 큰따옴표를 사용하지 마십시오. 작은따옴표를 사용하면 쉘이 내용을 구문 분석하지 않습니다.
- 명령을 평가하고 그 출력을 사용하려고 하지 마십시오. 그냥 실행하세요.
이는 수정된 스크립트의 시작 부분입니다. 전체적으로 유사한 변경 사항을 적용해야 합니다.
#!/bin/bash
screen -dmS xccda 'cd /root/constella && ./daemon.sh'
답변2
screen -dmS xccda bash -c 'cd /root/constella && ./daemon.sh'