我正在研究如何自动执行维护例程,其中包括启动和停止在屏幕会话中运行的脚本。我的方法是终止屏幕会话,然后重新启动它,并使用创建屏幕和传递命令的功能从脚本中运行命令,而无需连接到屏幕。
但是,我遇到了困难。我可以正确创建屏幕,而无需使用 附加它screen -d -m -S screen_name
。但是,如果我运行基于以下内容的命令:
screen -S screen_name-X stuff "command 1"'echo -ne '\015''"command 2"'echo -ne '\015''
echo -ne '\015' 用反引号而不是单引号括起来。这是用来模拟用户按下回车键,因为我使用的命令是移动到目录并执行位于该目录的脚本。此命令有效,但前提是屏幕在创建后已附加。由于我试图自动执行创建屏幕和运行其中的命令的过程,因此我希望避免在脚本内附加和分离。我将尝试创建一个 shell 脚本的建议,其中包含我需要在屏幕内执行的命令,并根据我的结果进行编辑。
有没有办法创建一个屏幕并在屏幕内运行一个命令,或者在创建之后但在执行命令之前不必附加到屏幕?
提前致谢。
**更新 - 尝试了将需要执行的命令放在 shell 脚本中的建议后,我能够成功创建一个屏幕并从屏幕内执行命令,但我得到的行为是,当脚本停止运行时,屏幕也会关闭。这不应该是个问题,因为该脚本是一个日志记录脚本,只有在系统管理员知情的情况下或通过我正在尝试开发的脚本时才会停止,但是,最好以这样的方式设置屏幕,即如果脚本停止,屏幕不会消失。有可能实现这种行为吗?**
答案1
我认为您可能遇到了几个问题。
如果命令在重新连接之前完成,屏幕将消失。您可以使用以下方法演示此操作:
screen -d -m ls -l
它将运行该ls -l
命令,但screen -list
由于屏幕进程已结束,因此不会显示它。
我也不知道你想用这个 \015 做什么。也许更新你的问题会有所帮助,因为我认为你想做的是在屏幕会话中运行多个命令。这应该很简单:
screen -d -m bash -c "command1 ; command2 ; command3"
如果这些命令使用得很多,也许你应该制作一个只运行这些命令的 shell 脚本,然后使用更简单的:
screen -d -m /path/to/script.sh
答案2
启动分离屏幕
screen -dmS <screen name>
在先前创建的分离屏幕中执行命令
screen -S <screen name> -X stuff '<CMD>\n'
是的,您需要输入回车符来提交命令,否则它只会将字符串添加到屏幕上。
答案3
这对我来说很有效,而且没有-c
不起作用
screen -d -m bash -c "command1; command2; command3"
答案4
测试以前答案的复制粘贴方法是:
# No sessions:
screen -ls
# Returns immediately:
time screen -dmS screen_descritive_session_name bash -c 'sleep 20; hostname >> /tmp/h'
# New session present:
screen -ls
# File with return of command was created :)
sleep 20; cat /tmp/h
预期结果应类似于:
No Sockets found in /var/run/screen/S-yourusernamehere.
(这意味着之前没有创建屏幕会话)
real 0m0.002s
user 0m0.000s
sys 0m0.000s
(这是创建屏幕和从屏幕分离所花费的时间。几乎是瞬间。)
There is a screen on:
20318.screen_descritive_session_name (20/08/2018 16:29:35) (Detached)
1 Socket in /var/run/screen/S-yourusernamehere.
(此输出显示可用的屏幕会话。在上一个命令上创建。)
sleep 20; cat /tmp/h
(这cat
显示在 gnu-screen 内执行的主机名)