使用GNU屏幕运行程序,并在之后立即分离


27

我试图弄清楚如何编写一个脚本,该脚本将在系统启动时在GNU Screen会话中启动程序。我正在尝试:

#!/bin/bash
screen -S test -d -m -X $HOME/folder/folder/.program \
screen -S test2 -d -m -X $HOME/folder/folder/.program2 \

但由于会话已分离,因此命令无法执行?我唯一需要的是在屏幕会话中运行命令并立即分离此会话。

感谢您的回答,但现在我遇到了另一个问题。在为“ program and program2”添加一些变量后,脚本停止工作。像这样:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program -f config.cfg

由于某些原因,“-f config.cfg”被忽略。我也试图引用命令,但也无济于事。


为什么-X选择?
enzotib 2011年

Answers:


34

您是否真的要把放在\行尾?如果不是,请尝试将其删除-它们会转义以下字符。

另外,删除-X帮助设置对我有用,例如:

screen -S test -d -m -X touch /tmp/test

失败No screen session found,但是:

screen -S test -d -m touch /tmp/test

工作正常。因此,我怀疑以下内容对您有用:

#!/bin/bash
screen -S test -d -m $HOME/folder/folder/.program
screen -S test2 -d -m $HOME/folder/folder/.program2

请记住,如果在引导时运行此命令,则$ HOME与以特定用户身份登录后的$ HOME不同。如果您需要以特定用户身份运行它,则需要使用诸如之类的su权限以该用户身份运行它,并且指定完整路径将消除任何歧义:

#!/bin/bash
screen -S test -d -m su - username /home/username/folder/folder/.program
screen -S test2 -d -m su - username /home/username/folder/folder/.program2

或者,您可以将整个脚本称为su - username /path/to/your/script


感谢您的回答,但现在我遇到了另一个问题。在我为“ program and program2”添加了一些变量后,脚本停止工作
TbMa 2011年

这:screen -S test -d -m $HOME/folder/folder/.program几乎可以完全满足我的要求,除非folder / .program完成,否则屏幕会话将自动关闭。程序完成后,是否有任何方法可以保持屏幕会话(外壳)运行?也许不是独占运行该程序,而是启动一个外壳程序,该外壳程序将启动该程序,然后返回到外壳程序提示符,或者其他内容?
RocketNuts

4

就像Cry Havok提到的那样,您可以将程序直接放在命令行上。

如果确实必须使用-X选项,则a)您需要指定'screen'命令,并且b)会话需要预先存在。

screen -dmS test
screen -S test -X screen $HOME/folder/folder/.program
screen -dmS test2
screen -S test2 -X screen $HOME/folder/folder/.program2

如果将程序放在命令行上,则在程序退出时屏幕将退出;否则,屏幕将退出。如果要查看控制台输出,我看不到命令​​行标志来保持屏幕打开。如果启动屏幕并单独发送命令,如此处所示,则可能需要显式sleep命令给屏幕时间来启动会话,然后再发送命令。
Chinasaur 2014年

这个答案与stackoverflow.com答案非常相似,后者回答了类似的问题。我更喜欢此答案,而不是@CryHavok,因为此答案是在用户的默认外壳程序内执行程序的程序(@CryHavok在没有父外壳程序的情况下运行程序,因此当程序死机或您ctrl-c时,屏幕会话将立即终止)
Trevor Boyd史密斯
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.