私の使命は、別々のセッションを開始してから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() { ... }
関数内の2つのコマンドにあります。次の行は画面を起動し、バックグラウンドで実行します。
screen -s "/bin/bash" -dmS "$1";
この行は、まるで画面に直接入力するかのようにコマンドを送信します。
screen -S "$1" -X stuff "$2\n$3\n";
また、次のようないくつかの追加機能もあります。
- 2つのコマンド($ 2と$ 3)を実行するので、画面を閉じて上矢印をクリックすると最新のコマンド(サーバーの実行)に移動し、Enterキーを押して再実行できます。
- crontabで再起動時に追加する方法を教えてください(
@reboot /bin/bash -li ~/start-screens
)。 - シェルを実行しますインタラクティブにそして全力を尽くすログイン環境、使用
-li
フラグ。私のテストでは、#!/bin/bash -li
crontabとcrontabの両方にこれが必要なようですが、@reboot /bin/bash -li
YMMVです。 - このスクリプトでは、複数のサービスを実行できます。 :)