我的任务是启动一个分离的screen会话(例如,当系统重新启动时),然后能够连接到它并中断/终止正在运行的进程,而无需终止屏幕。不幸的是,当我附加到screen会话并停止正在运行的命令时,整个screen会话将终止:
[screen is terminating]
Run Code Online (Sandbox Code Playgroud)
我使用以下命令来启动分离screen:
screen -dm -S screen_name /bin/bash -c 'cd ~/mydir; npm start'
Run Code Online (Sandbox Code Playgroud)
然后我使用以下方法附加到screen会话:
screen -r session_name
Run Code Online (Sandbox Code Playgroud)
如果我Ctrl-C,npm命令bash将退出并且屏幕将终止。
我想要的是在连接到屏幕时实现类似的行为,就像我手动启动会话npm内部一样screen:
screen -S session_name
Run Code Online (Sandbox Code Playgroud)
然后在screen会话中:
cd ~/mydir
npm start
Run Code Online (Sandbox Code Playgroud)
然后我可以在会话不终止的情况下执行Ctrl-C命令。npmscreen
小智 2
这是我得到的解决方案:
\n#!/bin/bash -il\n\n# To install:\n# - put this file somewhere in your home directory like ~/start-screens\n# - chmod a+x ~/start-screens\n# - run "crontab -e" and add this line:\n# @reboot /bin/bash -li ~/start-screens\n\nstart() { screen -s "/bin/bash" -dmS "$1"; screen -S "$1" -X stuff "$2\\n$3\\n"; }\n\nstart service1 "cd dir1" "node index.js"\nstart service2 "cd dir2" "node index.js"\nRun Code Online (Sandbox Code Playgroud)\n神奇之处在于start() { ... }函数中的两个命令。此行启动屏幕并在后台运行:
screen -s "/bin/bash" -dmS "$1";\nRun Code Online (Sandbox Code Playgroud)\n此行将您的命令发送给它,就像您自己直接在屏幕上键入它们一样:
\nscreen -S "$1" -X stuff "$2\\n$3\\n";\nRun Code Online (Sandbox Code Playgroud)\n它还有一些额外的功能:
\n@reboot /bin/bash -li ~/start-screens)。-li。#!/bin/bash -li在我的测试中,我似乎在crontab 和 crontab 中都需要这个@reboot /bin/bash -li,但是 YMMV。