暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

screen 非交互模式执行脚本

生有可恋 2022-05-19
2790

screen 是Linux下的会话管理程序,在运行交互式程序时,可以保持会话,必要时可以切到后台运行,或者从后台恢复会话。


大多数screen使用场景都是在交互式模式运行,如何让screen以静默方式运行,比如批量创建会话并运行任务。


这里要用到screen的两个技巧:

  • 创建一个 detached 状态的会话

  • 向一个已存在的会话发送命令


默认我们使用 -S 参数会创建一个活动会话。如果只创建不打开,可以使用以下参数:

    # screen -dmS screenName
    # screen -ls
    There are screens on:
            30828.screenName        (05/18/2022 05:49:21 PM)        (Detached)

    使用 -d -m 参数会创建一个detached状态的会话,文档中是这样解释的:

      -d -m   Start screen in "detached" mode. 
      This creates a new session but doesn't attach to it.
      This is useful for system startup scripts.

      向一个会话发送命令的语句为:

        screen -xS screenName \
        -p0 \
        -X stuff "/bin/bash /test.sh"$'\n'

        这里需要解释一下参数说明:

        • -x   Attach  to  a  not detached screen session.

        • -p  number_or_name  Preselect a window.

        • -X   Send the specified command to a running screen session.

        • stuff string 
          Stuff the string string in the input buffer of the current window.


        命令中用到的参数比较长,主要意思就是指定会话名、指定窗口(一个会话可以有多个窗口)、发送命令。其中 -X stuff "string" 是 screen 的很多命令中的一种,一会儿我们还会用到其它命令。


        在命令的结尾加了一个$'\n',代表回车换行,这里不能写成$"\n",试过了不生效。这个命令也可以写成两行,一行是内容,一行是回车。

          screen -xS screenName -p0 -X stuff "/bin/bash /test.sh"
          screen -xS screenName -p0 -X stuff $'\n'


          非交互地杀掉一个会话,也可以通过发命令的形式:

            # screen -ls
            There are screens on:
                    30828.screenName        (05/18/2022 05:49:21 PM)        (Detached)
            1 Sockets in var/run/screen/S-root.


            # screen -xS screenName -X quit
            # screen -ls
            No Sockets found in var/run/screen/S-root.



            刚才使用的命令是 -X stuff "string",现在退出会话用到的命令是 -X quit,当然它还有其它命令:

            • quit    Kill all windows and terminate screen.

            • stuff string   Stuff the string string in the input buffer of the current window.

            • select [WindowID]  选择窗口

            • kill  Kill current window.

            • log [on|off]  Start/stop writing output of the current window to a file "screenlog.n"


            最后,我们需要注意的是,如果使用 screen -dmS sessionName 创建会话,当多次执行会创建同名会话,只是前缀不同。这会给后面发送命令造成困扰,比如:

              # screen -dmS a
              # screen -dmS a
              # screen -ls
              There are screens on:
              214038.a (Detached)
              213282.a (Detached)
              2 Sockets in /var/run/screen/S-root.


              所以需要保证会话名的唯一性,不然就没法通过模糊匹配指定会话名发送命令了。

              文章转载自生有可恋,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论