Raspbian(Debian)マシンから Node.js サーバーを実行していて、サーバーをリモートで起動および停止したいのですが。私にとってこれは、シェルにアクセスするために PuTTY を使用することを意味します。ただし、PuTTYターミナルを閉じるかタイムアウトになると、サーバーがフォアグラウンドで実行されるため、サーバーがダウンします。
それを続ける方法はありますが、その後もプロセスを終了する方法はありますか?
あなたの質問は少し詳細に欠けていたので、あなたはPiのコンソールでサーバーを起動するコマンドを入力し、それがフォアグラウンドで実行されたことを意味していると思います。
これが事実である場合、実装する複雑さによって順序付けられた5つのオプションがあります。
@ f-tusselの回答 を使用します。あなたはGNU/Linuxを初めて使用するので、&
シンボルは、シェルが通常の処理(コマンドの待機)ではなく、バックグラウンドでプロセスを実行してプロンプトに戻るように指示しますプロンプトに戻る前に終了します)。これは技術的には、コマンドをバックグラウンドに分岐することと呼ばれます。
以前に行ったことを行いますが、screen
プロセスで行います。基本的に、これにはscreen
(DebianシステムではSudo apt-get install screen
)のインストールが必要です。その後、コマンドを入力してサーバーを起動する前に、screen
を実行します。これにより、PuTTY接続が停止した場合でも後で再接続できる新しいシェルが開きます。そのため、切断されたことがないかのように動作します。
screen
に慣れていない場合は、 Wikipedia と を読んでみてください。マンページ 。これと同じことをtmux
で行うこともできます。
forever node.jsモジュールを使用します。 を参照してください場所についてはhttps://stackoverflow.com/questions/4797050/how-to-run-process-as-background-and-never-die 私はこれを得た。
サーバーをバックグラウンドでscreen
プロセスに配置します。つまり、バックグラウンドで新しいscreen
セッションを作成しますが、アタッチすることはありません。そして、シェルを実行する代わりに、画面プロセスがサーバーを実行します。入力する内容は次のとおりです。
screen -d -m exec_your_server --put-args-here
必要に応じて、起動時にこれを実行できます。基本的に、画面コマンドをファイル/etc/rc.local
または/etc/rc.d/rc.local
に配置する必要があります。これを行う際に問題が発生した場合は、新しい質問をしてください。
この場合も、tmux
を使用してこれを行うことができます。
サービススクリプトを記述します。あなたはDebianを使用していて新しいので、おそらく、Debianが提供するデフォルトのinit
、つまりSystem V Initを使用しています。私はSystem V Initのサービスファイルを見たことはありません。systemdと少しのUpstartだけなので、ここでは手伝うことができません。これを追求したい場合は、新しい質問をしてください。
これは最も「ハッキー」な方法であるIMHOであり、サーバーを長期間実行している場合は、Sudo service your_server stop
などのコマンドを使用してシステム上の他のサービスのようにサーバーを管理できるため、これを検討する必要があります。このようにすると、サーバーが起動時に自動的に起動し、screen
も必要ありません。これは、バックグラウンドで自動的に行われるためです。
これは自動的にrootとしても実行されます。これは危険です。サーバーにロジックを設定して、サーバー用に特別に作成した非特権ユーザーになることで、持っている特権を削除する必要があります。 (これは、サーバーが危険にさらされた場合に備えて-誰かがサーバーを介してrootとして実行できるかどうか想像してみてください!ええ。 この質問 は、これについて話す。)
私はraspbianについては知りませんが、それはDebianから派生しているため、Nohupも利用できると思います。プロセスを次のように実行する代わりに、
$ proc &
使用してみてください:
$ Nohup proc &
Nohupは、端末が切断されたときにプロセスが終了するのを防ぎます。 HTH。
本当に深刻な場合は supervisord を使用してください。
これを実行してバイナリを実行する基本的な方法:
$ Nohup node app &
$ echo $! > node-instance.pid
殺したい時は
$ kill `cat node-instance.pid`
しかし、私は監督者を使用します。それはあなたが多くの派手なことをすることを可能にします。
シェルでbashを実行している場合は、代わりにdisown
コマンドを使用できます。このコマンドは、最初に見つかった実行中のプログラムを使用することを除いて、Nohup
コマンドと同じ結果になります。例えば :
$ command &
$ disown
または、プロセスをフォークして父親を強制終了するスクリプトを作成して、子がinitに継承されるようにすることもできます。それは私が例えばスクリプトのためにやっていることです。単純ではありませんが、起動すると自動的にバックグラウンドになり、ログオフしても終了しません。
別の解決策は、サービスファイルを作成して有効にし、簡単なコマンドで起動、停止、再起動などを行うことです。 (しかし、archlinuxを使用しているため、debianがsystemdを使用しているかどうかは本当にわかりません)