我有一个python脚本,它使用多处理和子进程与不同的参数并行启动多个外部命令.代码可以在这里找到.
为方便起见,我在GNU Screen会话中启动此脚本.运行此脚本的计算机有12个处理器,这些处理器在进程变为活动状态之前处于空闲
每个过程需要几个小时到几天才能运行,因此我经常断开与机器的连接并分离屏幕会话.
然而,最近我注意到了一种我以前从未体验过的行为.有几次我回到机器上,发现零负载是空闲的.如果我通过ps ux或获得活动进程列表,或者top我仍然可以在进程列表中找到脚本(和子进程).然后我重新连接屏幕会话以检查程序的状态,并立即将新的一批进程发送到队列,并且系统的负载在几秒钟内返回到12.请注意,除了重新连接屏幕会话之外,我对脚本完全没有任何作用.
我在系统上安装了一个监控工具,结果是一些流程在一段时间后完成并且没有启动新流程.因此系统处于活动状态,直到子进程忙,并且一旦没有更多的作业从队列中释放就变为空闲.
所以我的问题是,有没有人知道解释这种行为的任何原因?
编辑:大约一年后,这个问题不再可重现,无论是屏幕上的一些补丁还是python本身.我接受了答案,因为它为测试提供了良好的指导.
python subprocess gnu-screen multiprocessing idle-processing
是否有可能编写一个脚本来更改名称并打开当前选项卡的监视,假设它正在屏幕上运行?
谢谢.
我在我的机器上运行了一堆屏幕会话,但所有屏幕会话都是分离且不需要的.有没有一种方法可以关闭所有这些,所以当我输入"screen -ls"时我什么都没有?
当我在屏幕上启动的脚本完成后,我可以告诉它关闭它所在的当前屏幕吗?如果是这样的话?我知道我可以做"ctrl + a"然后k,然后是y.杀死它但我不在那里发出那些按钮.我尝试将"exit"添加到脚本的末尾,似乎并没有关闭它.
我还有一个脚本会在屏幕上自动启动另一个脚本,这似乎有效,但我不是100%确定我的所有语法都正确吗?
screen -dm -S "script0$scriptID"; sleep 1; screen -S "fscript0$scriptID" -X screen ./script.sh "$input1" "$input2"
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.
想知道如何启动命令,例如:
while :; do ./myCommand; done;
Run Code Online (Sandbox Code Playgroud)
但不是做平时
screen -S nameOfMyScreen
Run Code Online (Sandbox Code Playgroud)
然后命令
while :; do ./myCommand; done;
Run Code Online (Sandbox Code Playgroud)
然后拆下屏幕
^a ^d (Control "a" the control "d"
Run Code Online (Sandbox Code Playgroud)
我希望它能够开始和分离.谢谢!
如果我作为守护进程启动GNU屏幕会话,我将如何以编程方式检索其PID?我不知道输出screen -ls是多么一致 ,所以我想知道如何使用bash的常量之一$$,$!或者更好的替代方法.
我正在启动屏幕screen -dmS screenname.
如何在开始屏幕会话之前或之后立即获得屏幕的PID?
我想知道是否有人尝试将他们的gnu-screen会话记录到日志文件中(除了默认的screenlog.N,其中N是会话号).
我尝试过以下操作
~$ screen -L custom_screenlog -S test_session
Run Code Online (Sandbox Code Playgroud)
但屏幕会终止.它不在屏幕手册中.尝试搜索谷歌,我似乎无法看到答案.
谢谢.
OPTIONS="java -Xms1024M -Xmx1024M -jar craftbukkit.jar"
PROCESS=server01
screen -dmS $PROCESS $OPTIONS nogui # Starting the application
screen -x $PROCESS -X stuff `printf "stop\r"` # Closing the application
screen -x $PROCESS # Attaching to the terminal of the application
Run Code Online (Sandbox Code Playgroud)
应用程序在开始时工作正常,但是我遇到问题stuff 'printf "stop/r"'
当我刚启动时似乎没有工作,等待一段时间然后尝试使用上面的命令停止它.但奇怪的是,如果我这样做screen -x $PROCESS并且分离(ctrl-A & ctrl-D)然后我使用Stop命令它确实有效.那么,有没有办法解决,以stuff printf不screen -x $PROCESS?
如何增加可以查看的行数screen?
我想查看从运行screen -S <screen_name>到当前操作时的行.例如,如何将缓冲区长度增加到大约50000行?
我已经尝试了^a :scrollback <number>但它不会增加我在当前终端中可以到达的线路.
我开始了一个putty窗口,改变了字体,然后做了Windows-Left以使其适合屏幕的左侧,它决定在下面做截图.我发现让它消失的唯一方法是注销/开启,但这显然是不切实际的,并没有解决问题.
我过去曾经拥有它,但不是很糟糕.它通常发生在我移动或调整窗口大小时.是否有设置让它只是默认自动调整大小?
[编辑]然后,关于:05以后突然冒出来,它突然消失了.我只是坐在这里做其他事情,它变回了正常状态.

gnu-screen ×10
bash ×5
linux ×2
shell ×2
byobu ×1
command-line ×1
detach ×1
gnu ×1
printf ×1
python ×1
scripting ×1
subprocess ×1
unix ×1