是否可以编写一个脚本来自动创建屏幕会话(例如创建所有 10 个屏幕会话),以便每个会话都能运行自己的任务?
目前我必须使用screen -S session1
→运行某些东西→ Ctrl++A才能D退出screen -S session2
...
答案1
假设您想要在相应的会话、、 ...中运行位于当前目录中的脚本task1
、 、 ... 、。进一步假设,当每个任务结束时,您希望其会话以交互式 shell 继续,这样您仍然可以附加到它,在其中查看任务的输出,并在其中运行进一步的命令。task2
task10
screen
session1
session2
session10
for i in {1..10}; do
screen -dmS "session$i" sh -c "./task$i; exec bash"
done
这是方法jw013 有描述,但会循环重复执行。每个会话都以分离方式启动(-dm
)并使用sh -c
运行脚本,然后用替换自身bash
。
在您使用的手动方法中,每个会话都是从附加的开始的,然后您从每个会话中分离(可能最后一个除外),以便创建剩余的会话。但是使用此处显示的方法,即使所有脚本都在运行,也尚未附加任何内容。您可以按照常规方式管理和附加到会话。例如,screen -ls
将列出所有会话,并附screen -x session10
加到session10
正在运行的会话task10
。
如果您希望每个会话在脚本运行后立即结束(这与您当前手动执行的结果不同),那么您可以使用 just"./task$i"
代替sh -c "./task$i; exec bash"
:
for i in {1..10}; do
screen -dmS "session$i" "./task$i"
done
无论使用哪种方式,您都可以按照编写的方式运行整个循环,无论您喜欢哪种方式:作为交互式 shell 中的命令、脚本或 shell 函数。循环本身几乎立即完成;无论您的任务运行多长时间,一旦所有会话启动,for
循环就会完成。screen