如何在分离模式下使用屏幕运行 bash 脚本?

如何在分离模式下使用屏幕运行 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它不会打开屏幕会话,这就是发生的情况

i execute ./main sh and nothing shows and script never ends

当单独运行时,每个 shell 脚本都像这样运行

runs pretty well :c

答案1

让我们从脚本的前几行开始。这个问题影响到所有这些问题,但这里只处理一个问题会更容易。

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

如果您将其声明为bash脚本,请勿用于sh运行它。要么设置权限并运行它,要么./main.sh使用正确的 shell bash main.sh

现在,为什么脚本似乎挂起。会话screen传递一个双引号字符串。简单地说,这意味着 shell 可以计算以 . 开头的表达式和变量$。您已包含一条$( ... )指令,该指令告诉 shell 执行其内容并用其写入的结果替换整个字符串标准输出。显然,要进行替换,命令必须完成。但你的没有。此外,无论如何你都不想要输出。

总之,

  1. 使用正确的 shell 解释器
  2. 不要在这里使用双引号 - 使用单引号,这样 shell 就不会解析内容
  3. 不要尝试评估该命令并使用其输出。只需执行即可。

这是修改后的脚本开头;请记住在整个过程中应用类似的更改:

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

答案2

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

相关内容