PuTTY または端末が閉じられた後も、プロセスは引き続き実行されます。

PuTTY または端末が閉じられた後も、プロセスは引き続き実行されます。

Node.jsサーバーがRaspbian(Debian)システムにあり、サーバーをリモートで起動して停止したいと思います。これが私に意味するものは次のとおりです。パテPuTTY 端末を閉じるか、タイムアウトを超えない限り、シェルにアクセスすると、サーバーはフォアグラウンドで実行されているため、サーバーも一緒にシャットダウンします。

続行しますが、後でプロセスを終了する方法はありますか?

答え1

私はraspbianについては知りませんが、Debianから派生したので、nohupも利用できると仮定します。プロセスを実行する代わりに、

$  proc &

以下を試してください。

$ nohup proc &

nohup は、端末接続が切断されたときにプロセスが終了するのを防ぎます。 HTH。

答え2

あなたの質問には詳細が少し足りないので、Piコンソールでサーバーを起動するコマンドを入力し、フォアグラウンドで実行されたことを意味します。

この場合、実装の複雑さに応じて5つのオプションがあります。

  1. 使用@f-Tasserの返信。 GNU/Linux を初めて使用する場合、この&シンボルは通常実行する操作 (つまり、プロンプトに戻る前にコマンドが完了するのを待つ) ではなく、バックグラウンドでプロセスを実行し、すぐにプロンプ​​トに戻る必要があることをシェルにお知らせします。 。技術的には、これはコマンドをバックグラウンドにフォークすることです。

  2. 以前に行った操作を段階的に実行しますscreen。デフォルトでは、このコマンドscreenはDebianシステムにインストールしsudo apt-get install screenてからサーバーを起動するコマンドを入力する前に実行する必要がありますscreen。これにより、PuTTY接続がこのように中断されても、後で再接続できる新しいシェルが開きます。したがって、接続が切断されていないかのように動作します。

    よく分からないならscreen読んでみるといいと思います。ウィキペディアそしてマンページから。を使用して同じことを行うこともできますtmux

  3. 使用永遠にNode.jsモジュール。バラよりhttps://stackoverflow.com/questions/4797050/how-to-run-process-as-Background-and-never-die私はこれをどこで得ましたか?

  4. サーバーをscreenバックグラウンドプロセスに配置します。つまり、screenバックグラウンドで新しいセッションを作成しますが、接続しません。また、画面プロセスはシェルを実行する代わりにサーバーを実行します。次のように入力します。

    screen -d -m exec_your_server --put-args-here
    

    必要に応じて起動時に実行できます。デフォルトでは、画面コマンドをファイルまたは/etc/rc.localに入れる必要がありますが、/etc/rc.d/rc.localどちらかを忘れていました。これを行うのに問題がある場合は、新しい質問をしてください。

    同様に、同じことができますtmux

  5. サービススクリプトを作成します。あなたはDebianを使用していて初めて使用するので、おそらくDebianが提供するデフォルト設定でinitあるSystem V Initを使用しているでしょう。私はSystem V Init用のサービスファイルを見たことがなく、systemdとわずかなUpstartだけを見ました。したがって、ここでは助けることができません。この質問を続けるには、新しい質問をしてください。

    IMHOこれは最小限の「ハッキング」方法であり、サーバーを長時間実行している場合は、次のコマンドを使用してシステムの他のサービスのようにサーバーを管理できるため、この方法を考慮する必要がありますsudo service your_server stop。この方法は起動時にサーバーを自動的に起動し、screenバックグラウンドでも自動的に発生するため、必要はありません。

    また、自動的にrootとして実行されますが、これは危険です。サーバー用に特別に作成された権限のないユーザーになり、自分が持っている権限を放棄するロジックをサーバーに入れる必要があります。 (これはサーバーが破損するのを防ぐためです。誰かがあなたのサーバーを介してrootとして何かを実行できると想像してください!この問題これについて話すのはうれしかったです。 )

答え3

使用監督本当にマジだったら。

バイナリを実行する基本的な方法は次のとおりです。

$ nohup node app &
$ echo $! > node-instance.pid

それから殺したいとき

$ kill `cat node-instance.pid`

しかし、私はSupervisordを使います。それはあなたが多くの素晴らしい仕事をすることを可能にします。

答え4

Bashシェルを実行している場合は、オプションでこのdisownコマンドを使用できます。このコマンドは、nohup見つかった最初の実行プログラムを使用することを除いて、同じことを行います。たとえば、

$ command &
$ disown

あるいは、プロセスを分岐して親プロセスを終了して、子プロセスがinitによって継承されるようにするスクリプトを生成することもできます。たとえば、これが私がスクリプトでしたことです。簡単ではありませんが、起動すると自動的にバックグラウンドに入り、ログアウトしても終了しません。

別の解決策は、簡単なコマンドで起動、停止、再起動、またはすべての操作を実行できるようにサービスファイルを作成して有効にすることです。 (しかし私はarchlinuxを使用しているので、Debianがsystemdを使用しているかどうかはわかりません)

関連情報