我的任务是启动一个分离的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-C
,npm
命令bash
将退出并且屏幕将终止。
我想要的是在连接到屏幕时实现类似的行为,就像我手动启动会话npm
内部一样screen
:
screen -S session_name
然后在screen
会话中:
cd ~/mydir
npm start
然后我可以在会话不终止的情况下执行命令Ctrl-C
。npm
screen
答案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 -li
crontab 和 crontab 中都需要这个@reboot /bin/bash -li
,但是 YMMV。 - 您可以在这个脚本中运行多个服务。 :)