分離モードで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

スクリプトの最初の数行から始めましょう。この質問はすべての質問に影響しますが、ここでは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'

おすすめ記事