web-dev-qa-db-ja.com

PuTTYまたはターミナルが閉じられた後もプロセスを実行し続ける

Raspbian(Debian)マシンから Node.js サーバーを実行していて、サーバーをリモートで起動および停止したいのですが。私にとってこれは、シェルにアクセスするために PuTTY を使用することを意味します。ただし、PuTTYターミナルを閉じるかタイムアウトになると、サーバーがフォアグラウンドで実行されるため、サーバーがダウンします。

それを続ける方法はありますが、その後もプロセスを終了する方法はありますか?

65
Spencer

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

これが事実である場合、実装する複雑さによって順序付けられた5つのオプションがあります。

  1. @ f-tusselの回答 を使用します。あなたはGNU/Linuxを初めて使用するので、&シンボルは、シェルが通常の処理(コマンドの待機)ではなく、バックグラウンドでプロセスを実行してプロンプトに戻るように指示しますプロンプトに戻る前に終了します)。これは技術的には、コマンドをバックグラウンドに分岐することと呼ばれます。

  2. 以前に行ったことを行いますが、screenプロセスで行います。基本的に、これにはscreen(DebianシステムではSudo apt-get install screen)のインストールが必要です。その後、コマンドを入力してサーバーを起動する前に、screenを実行します。これにより、PuTTY接続が停止した場合でも後で再接続できる新しいシェルが開きます。そのため、切断されたことがないかのように動作します。

    screenに慣れていない場合は、 Wikipediaを読んでみてください。マンページ 。これと同じことをtmuxで行うこともできます。

  3. forever 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として実行できるかどうか想像してみてください!ええ。 この質問 は、これについて話す。)

48
strugee

私はraspbianについては知りませんが、それはDebianから派生しているため、Nohupも利用できると思います。プロセスを次のように実行する代わりに、

$  proc &

使用してみてください:

$ Nohup proc &

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

49
F. Tusell

本当に深刻な場合は supervisord を使用してください。

これを実行してバイナリを実行する基本的な方法:

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

殺したい時は

$ kill `cat node-instance.pid`

しかし、私は監督者を使用します。それはあなたが多くの派手なことをすることを可能にします。

6
onur güngör

シェルでbashを実行している場合は、代わりにdisownコマンドを使用できます。このコマンドは、最初に見つかった実行中のプログラムを使用することを除いて、Nohupコマンドと同じ結果になります。例えば ​​:

$ command &
$ disown

または、プロセスをフォークして父親を強制終了するスクリプトを作成して、子がinitに継承されるようにすることもできます。それは私が例えばスクリプトのためにやっていることです。単純ではありませんが、起動すると自動的にバックグラウンドになり、ログオフしても終了しません。

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

5
Depado