【问题标题】:How to create a screen executing given command?如何创建执行给定命令的屏幕?
【发布时间】:2011-10-26 07:53:13
【问题描述】:

我是 *nix 的新手。有没有办法创建一个屏幕,它将立即执行给定的命令序列(使用他们自己的参数)?两个小时的谷歌搜索一无所获——也许是因为我做不到 清楚地陈述问题。

我希望有类似的东西

screen -dmS new_screen exec "cd /dir && java -version"

我正在使用 screen v4.00.03 和 CentOS 5.5(内核版本 2.6.18-194.26.1.el5.028stab079.2)

【问题讨论】:

标签: gnu-screen


【解决方案1】:

您创建一个具有名称并处于分离模式的屏幕:

screen -S "mylittlescreen" -d -m

然后你发送要在你的屏幕上执行的命令:

screen -r "mylittlescreen" -X stuff $'ls\n'

stuff 命令用于在屏幕内发送击键。 string 命令前的$ 是为了让shell 解析引号内的\n,执行命令时需要换行符(就像按回车一样)。

这在这个屏幕版本上对我有用:

$屏幕-v

屏幕版本 4.00.03jw4 (FAU) 2-May-06

有关命令的详细信息,请参阅man screen

【讨论】:

    【解决方案2】:

    问题是使用 'exec' screen 命令不会启动 shell。 'cd' 是一个内置的 shell,所以你需要一个 shell。此外,您需要一个继续运行的 shell,以便屏幕不会终止。

    您可以使用 -X 选项来 screen 将命令发送到正在运行的屏幕会话,并使用“stuff”命令将击键发送到当前窗口。试试这个:

    screen -dmS new_screen sh
    screen -S new_screen -X stuff "cd /dir
    "
    screen -S new_screen -X stuff "java -version
    "
    

    是的,您需要将引号放在下一行才能执行命令。

    【讨论】:

    • 不起作用,当我附加到场景时,没有执行任何操作
    • 似乎只有在运行screen -X stuff 之前附加屏幕才有效。
    • 我通过在其中包含-p 0 (screen -S new_screen -p 0 -X stuff "...") 来为我工作
    • 您可以使用$'command \n' 而不是将双引号放在下一行。见this
    • @mloar stuff 这里的目的是什么?
    【解决方案3】:

    screen -dmS screen_name bash -c 'sleep 100'

    这将创建名为screen_name 的新屏幕。在屏幕内它会休眠 100 秒。

    请注意,如果您键入一些命令来代替sleep 100,该命令会在执行后立即终止,屏幕也会终止。 因此您将无法看到刚刚创建的屏幕

    【讨论】:

      【解决方案4】:

      我想从 bash 脚本中启动远程屏幕,其中一些变量在 bash 脚本中定义并且在屏幕中可用。所以对我有用的是

      #!/bin/bash
      SOMEVAR1="test2"
      # quit existing if there is one running already, be careful
      screen -D -RR test1 -X quit || true
      screen -dmS test1
      screen -r test1 -p 0 -X stuff $"echo ${SOMEVAR1} ^M"
      

      其中返回字符^M,需要用vim as输入

      i CTRL-V ENTER ESCAPE
      

      【讨论】:

        【解决方案5】:

        我觉得你可以用这个

        function exec_in_screen() {
          name=$1
          command=$2
          screen -dmS $name sh; screen -S $name -X stuff "$command\n";
        } 
        

        那么……

        exec_in_screen "test" "ls"

        【讨论】:

          【解决方案6】:

          另一种方法

          第一行 cd 到你的目录。 第二行使用 bash 启动一个名为 new_screen 的新屏幕会话。 第三行执行java -version

          cd /dir
          screen -dmS new_screen bash
          screen -S new_screen -p 0 -X exec java -version
          

          【讨论】:

            【解决方案7】:

            是的,你想要的是“stuff”命令

            例如

            screen -dmS new_screen -X stuff "cd /dir && java -version

            "

            第二个引号在下一行,以便在发送时执行

            【讨论】:

            • 这会导致“未找到屏幕会话”。留言
            猜你喜欢
            • 1970-01-01
            • 2013-08-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-24
            • 2015-09-19
            相关资源
            最近更新 更多