一旦执行脚本结束,防止GNU屏幕终止会话


34

我试图强迫GNU屏幕创建一个“虚拟”终端,而不附加它,在脚本内部执行脚本,并且在脚本结束后不终止会话。

我尝试了许多组合,包括:

screen -dmS udplistener /share/Sys/autorun/start_udp_listeners.sh

要么

screen -S udplistener -X /share/Sys/autorun/start_udp_listeners.sh

他们都没有工作。我要么获得没有执行脚本的会话,要么执行脚本,但是会话一旦完成就终止,或者出现“找不到屏幕会话”错误。

我基本上想做的是运行用PHP编写的UDP侦听器,并使它在无限循环中工作(不要中断侦听)。是的-我可以&在末尾运行PHP脚本,强制PHP CLI作为守护程序运行。问题是,我正在使用一块称为服务器的垃圾(QNAP-永远不要购买此垃圾!),这似乎没有理会。一旦注销SSH会话,脚本就会停止。

因此,screen似乎是唯一的选择。但是我不明白,为什么一旦执行的命令或脚本结束,它就会终止会话?

编辑:我也尝试过在互联网上找到的示例:

screen -dmS name
screen -S name -p windowname -X stuff 'mc
'

不缺!附加到(screen -R name)后,我看到Midnight Commander HASN尚未执行。尽管示例作者说过,但是会的。


调用方式screen仅创建一个窗口以运行单个命令。当命令退出时,窗口关闭并且screen没有任何可做的事情,因此退出。
2012年

那么...有没有办法打开两个窗口(仅使用命令行,不使用键盘组合),一个窗口执行脚本,第二个窗口防止screen关闭?顺便说一句:我仍然不明白这个想法!如果调用screen -dmS name,我将创建一个独立的窗口,该窗口也无事可做。但是它不会自动关闭!但是,当我想在该分离的屏幕中执行某些操作时,一旦执行完成,操作便会结束。为什么?我在这里看不到逻辑。可以让窗口什么都不做,但是不能让窗口什么都不做然后又什么也不做吗?
trejder 2012年

2
在不指定命令的情况下启动窗口时,它不是 “什么也不做”。它正在执行的“操作”正在运行交互式外壳程序,该外壳程序只有在您手动退出后才会退出。
jw013 2012年

凉!感谢您的解释!那么……回到问题所在……一旦命令执行结束,有没有办法在独立的屏幕/窗口中运行命令而不结束该会话?另外,请查看更新的问题。谢谢。
trejder 2012年

该脚本正在执行两个用PHP编写的UDP侦听器。尽管两者都作为守护程序执行(&在末尾带有),但由于服务器(QNAP)的问题,它们在会话结束时被终止(有人告诉我,如果使用来执行,则它们不应在普通Linux上使用&)。因此,我不希望在start_udp_listeners.sh完成操作后执行任何操作,仅希望如何防止会话终止。只要不是,我的PHP侦听器就可以正常工作。
trejder 2012年

Answers:


42

要在脚本完成后保持屏幕繁忙,只需在窗口中保持某些内容持续运行即可。该“事物”的最简单选择可能是交互式外壳。这是一种实现方法(假设bash是交互式shell的选择):

screen -dmS session_name sh -c '/share/Sys/autorun/start_udp_listeners.sh; exec bash'
  • -dm:以分离模式启动屏幕
  • -S:设置屏幕的会话名称,以便以后检索
  • sh -c '...':使用sh -c运行多个命令,而不是简单地运行将终止的脚本,
  • exec bash:脚本终止后,sh上方的将从切换到交互式外壳程序(bash),该外壳程序在外部终止之前永远不会退出。screen只要bash实例处于活动状态,它就会保持打开状态。

1
嗯...看来你是我一生的救星!:]扩展您的解决方案export IGNOREEOF=1以防止使用Ctrl + D意外终止,这应该给了我一个完美的解决方案,我一直在整整整整一个晚上。谢谢!:]
trejder 2012年


@ToVine在Debian Stable(Wheezy)上完美工作。我曾经用过bash -c
TranslucentCloud

@TranslucentCloud您是否将整个命令“ bash -c ...”括在引号中?我上次尝试(在写评论之前)对我不起作用,不确定为什么...
ToVine 2015年

@ToVine这是我的全部命令:screen -LS sauf bash -c "sudo aptitude update && sudo aptitude full-upgrade; exec bash"
TranslucentCloud

2

我在sh -c运行Debian 7.8的树莓派2上没有运气。但是bash -c做了工作:

命令:

/usr/bin/screen -dmS test-screen bash -c "/usr/bin/top; exec bash"

可能是因为您正在Raspberry Pi上使用其他外壳程序吗?在bashsh似乎是两种不同的炮弹。我想这就是全部,但是我可能是错的,因为我完全是Linux的新手。
trejder

1
sh是默认的unix-shell,它包含在raspbian(debian)中。命令sh也可以,但与屏幕结合使用时,sh -c无效。
scotty86 '16

谢谢@ scotty86,我观察到同样在Linux Mint的19(Ubuntu的18.04),改变sh -cbash -c的伎俩。我不明白为什么,都shbash安装,所以我还是失眠了,但至少它的工作原理。
Redsandro '18 -10-24

sh可能指向/bin/dash而不是/bin/bash。Debian将默认shell从几年前切换bashdash了。
scai
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.