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

Gab*_*vay 5 bash gnu-screen

我的任务是启动一个分离的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-Cnpm命令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"\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
screen -s "/bin/bash" -dmS "$1";\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
screen -S "$1" -X stuff "$2\\n$3\\n";\n
Run Code Online (Sandbox Code Playgroud)\n

它还有一些额外的功能:

\n
    \n
  • 它执行两个命令($2 和 $3),这样如果你关闭屏幕,然后点击向上箭头,它将带你到最近的命令\xe2\x80\x94来运行服务器\xe2\x80\x94,这样你就可以点击输入并重新运行它。
  • \n
  • 它告诉您如何在 crontab 中重新启动时添加它(使用@reboot /bin/bash -li ~/start-screens)。
  • \n
  • 它使用标志以交互方式并在完整的登录环境中执行 shell -li#!/bin/bash -li在我的测试中,我似乎在crontab 和 crontab 中都需要这个@reboot /bin/bash -li,但是 YMMV。
  • \n
  • 您可以在这个脚本中运行多个服务。:)
  • \n
\n