退出其中运行的命令后如何保持屏幕运行?

退出其中运行的命令后如何保持屏幕运行?

我的任务是启动一个分离的screen会话(例如,当系统重新启动时),然后能够连接到它并中断/终止正在运行的进程没有屏幕终止。不幸的是,当我附加到screen会话并停止正在运行的命令时,整个screen会话将终止:

[screen is terminating]

我使用以下命令来启动分离screen

screen -dm -S screen_name /bin/bash -c 'cd ~/mydir; npm start'

然后我screen使用以下方法附加到会话:

screen -r session_name

如果我Ctrl-Cnpm命令bash将退出并且屏幕将终止。

我想要的是在连接到屏幕时实现类似的行为,就像我手动启动会话npm内部一样screen

screen -S session_name

然后在screen会话中:

cd ~/mydir
npm start

然后我可以在会话不终止的情况下执行命令Ctrl-Cnpmscreen

答案1

这是我得到的解决方案:

#!/bin/bash -il

# To install:
#   - put this file somewhere in your home directory like ~/start-screens
#   - chmod a+x ~/start-screens
#   - run "crontab -e" and add this line:
#     @reboot /bin/bash -li ~/start-screens

start() { screen -s "/bin/bash" -dmS "$1"; screen -S "$1" -X stuff "$2\n$3\n"; }

start service1 "cd dir1" "node index.js"
start service2 "cd dir2" "node index.js"

神奇之处在于start() { ... }函数中的两个命令。此行启动屏幕并在后台运行:

screen -s "/bin/bash" -dmS "$1";

此行将您的命令发送给它,就像您自己直接在屏幕上键入它们一样:

screen -S "$1" -X stuff "$2\n$3\n";

它还有一些额外的功能:

  • 它执行两个命令($2 和 $3),因此,如果您关闭屏幕并点击向上箭头,它会将您带到最近的命令(运行服务器),以便您可以按 Enter 并重新运行它。
  • 它告诉您如何在 crontab 中重新启动时添加它(使用@reboot /bin/bash -li ~/start-screens)。
  • 它执行外壳交互地并用你的全力登录环境,使用-li标志。在我的测试中,我似乎在#!/bin/bash -licrontab 和 crontab 中都需要这个@reboot /bin/bash -li,但是 YMMV。
  • 您可以在这个脚本中运行多个服务。 :)

相关内容