在屏幕会话的多个进程中自动粘贴命令

Automatically paste commands in multiple processes of a screen session

我有几个 linux 命令包含在一个文本文件中,由 \n\n 分隔,我想在给定的屏幕进程中自动粘贴每个命令。为了清楚起见,假设我的 command.txt 只包含 :

#first bunch of commands:    
executable_script1.sh
mv executable_script1 directory1


#second bunch of commands:    
executable_script2.sh
mv executable_script2 directory2

所以第一组命令会 运行 executable_script1.sh,之后会移动 executable_script1。在此示例中,我的屏幕包含 3 个进程:

0$ htop
1$ bash
2$ bash

进程的名称无关紧要,唯一重要的信息是我想在屏幕进程 N$ 中执行命令 N,因为 0$ 始终是 htop.

至于现在,我已经copying/pasting在相应的屏幕进程中手动处理了每串命令,效果明显,但现在我将处理40多串命令和尽可能多的屏幕进程.那么,如何将命令 N 自动粘贴到 N$ 屏幕终端?我认为 bash/shell 脚本可以解决问题,但我对它不够流利。我目前使用 python2 脚本来生成我的 command.txt 文件,所以请注意,如果需要,我可以很容易地通过一堆命令创建一个 txt 文件。

你能帮我解决这个问题吗?请随时询问任何遗漏的信息。

PS:我也在Unix Stackexchange上问过这个问题,但是这个论坛的人似乎少得多......如果我们在这里找到答案,我会邀请回答者将它也粘贴到我的 Unix Stackexchange 问题下,因为这可以帮助其他人!

感谢this post,我终于找到了答案!有时只需要一些其他关键字就可以找到解决方案,所以我会回答这个问题以防其他人在这里结束。

简而言之

使用bash命令在屏幕中自动粘贴命令:

screen -x screen_name -p 1 -X stuff 'executable_script1.sh\n'

其中 -p 1 指的是 1$ 屏幕进程。请注意,命令末尾的 \n 是必需的,因为在粘贴命令行后按回车键时。

详细步骤

1) 创建您要在其中工作的 screen 会话(此处命名为 'screen_name'):

screen -S screen_name

为所有命令提供足够的进程(在我的示例中,0$ htop 加上 2 个进程:1$2$)。请注意,您可以在您的主目录中编辑 .screenrc,以便屏幕会话默认以给定数量的进程启动。对于这个例子,我的 .screenrc 包含:

screen -t htop
screen -t 
screen -t 

2) 为每组命令创建 bash 文件,由不同的屏幕进程执行。

这里我有 2 个文件,screen1 包含:

#!/bin/bash

screen -x screen_name -p 1 -X stuff 'executable_script1.sh\n'
screen -x screen_name -p 1 -X stuff 'mv executable_script1 directory1\n'

screen2包含:

#!/bin/bash

screen -x screen_name -p 2 -X stuff 'executable_script2.sh\n'
screen -x screen_name -p 2 -X stuff 'mv executable_script2 directory2\n'

3) 在终端中一次粘贴所有命令,使用 :

bash /path_to_screen1/screen1 & /path_to_screen2/screen2 &

您可以立即关闭此终端,即使您有很长的 运行 计算,因为它所做的只是将命令粘贴到 screen 中。手动打开您的 screen 会话以验证这些行是否正在执行。

不用说,如果您有大量命令要传递给许多屏幕进程,您可以创建 bash 文件并通过脚本粘贴命令(步骤 2 和 3)(使用 python例如)。如果需要,executable_script1.sh 也可以包含 python 调用,就像在普通终端中一样,使用 python python_script.py

希望这对其他人有帮助!