如何获取循环的屏幕会话名称列表

如何获取循环的屏幕会话名称列表

我使用了一个循环,使用 Bash 创建了一组屏幕,这些屏幕连接到一组串行端口:

for i in $(ls /dev/ttyACM*)
do
    screen -S ${i##*/} -L -d -m $i
done

随后,我想重复向所有这些屏幕发送重置命令,直到它们全部关闭(某些设备需要多次重置才能重新启动)。为此,我需要活动屏幕会话名称的列表。

不幸的是,像这样的命令for j in $(screen -ls); do echo $j; done会返回以下内容:

There
are
screens
on:
33097.ttyACM6
(17.05.2021
18.53.46)
(Detached)
33085.ttyACM0
(17.05.2021
18.53.46)
(Detached)
2
Sockets
in
/run/screen/S-keir.finlowbates.

我想要的是这样的命令,它返回:

ttyACM6
ttyACM0

然后我就可以运行:

for i in $(<<magic stuff here>>)
    screen -S ${i##*/} -X stuff 'reset^M'
done

直到没有更多的屏幕剩余。

谁能帮我解决<<这里的神奇东西>>吗?

答案1

screen -ls以格式打印出来

There are screens on:
    screen_name    (Status)
X Sockets in /path/to/screen/socket/dir

您的具体输出可能如下所示:

There are screens on:
    33097.ttyACM6    (17.05.2021 18.53.46)   (Detached)
    33085.ttyACM0    (17.05.2021 18.53.46)   (Detached)
2 Sockets in /run/screen/S-keir.finlowbates.

因此,当您编写的 for 循环迭代这些值时,它只是回显由空格分隔的每个项目。

假设您的所有屏幕都与您提供的格式匹配并且具有关联的 tty,那么获取该信息的最简单方法就是运行screen -ls | grep "tty"| awk '{print $1}' | cut -d. -f 2.

screen -ls返回上面显示的结果,grep tty仅返回其中包含 tty 的行,awk {print $1}打印该行中的第一列,并将cut -d. -f2分隔符设置为 a.并返回字段 2,在本例中为 tty 值。

对于您的示例,这将返回:

ttyACM6
ttyACM0

答案2

虽然screen没有返回格式整齐的结果,但事实证明您可以查询 Linux 文件系统来获取所需的信息:

ls /var/run/screen/S-${USER}

这将返回 PID 和屏幕会话名称,例如443653.ttyACM6 443818.ttyACM6。尽管您可以使用替换来删除点之前的所有内容,但事实证明您可以使用整个内容重新附加到屏幕会话PID.sessionName

for i in $(ls /var/run/screen/S-${USER})
  do
    screen -r ${i} -X stuff 'reset^M'
  done

相关内容