내 임무는 분리된 세션을 시작한 다음 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입니다. - 이 스크립트에서는 여러 서비스를 실행할 수 있습니다. :)