バックグラウンドプロセスを開始する正しい方法

バックグラウンドプロセスを開始する正しい方法

SSHセッションのリモートシステムでデフォルトのnode.jsサーバーを起動したいと思います。これはうまくいくようです:

nohup node server/server.js &  disown

たぶんnohupが必要ではないでしょうか? SIGTERMなどによって終了しないバックグラウンドプロセスを開始する「公式の」方法は何ですか?バックグラウンドプロセスを開始してからセッションを終了し、プロセスを実行し続けたいと思います。

答え1

screenもちろんですtmux。ただし、接続を切断して再接続したい対話型セッション(通常はリモートシステム)のためのものです。あなたのアプリケーションは一種のサーバーのように見えるので、システムサービス(通常「悪魔「)その逆です。

以下では、使用しているシステムが次のとおりです。システム。次の場所にユニットファイルを作成するだけです/etc/systemd/system/foo.service

[Unit]
Description=My foo service
After=network.target

[Service]
ExecStart=/usr/bin/node /absolute/path/to/your/server.js
Restart=always
User=nobody

[Install]
WantedBy=multi-user.target

サービスがディスク上のファイルにアクセスする必要がある場合は、必要に応じてユーザーを変更してください。サービスファイルが準備されたら、次のコマンドを実行してsystemdに設定ファイルを再ロードし、サービスを実行するように要求します。

$ sudo systemctl daemon-reload
$ sudo systemctl start foo.service

システム起動時に自動的に起動しますか?ただアクティブにしてください:

$ sudo systemctl enable foo.service

問題が発生しましたか?次のコマンドを使用して問題を解決できます。

$ systemctl status foo.service
$ journalctl -u foo.service

サービスの終了/終了を防ぐためのあなたの要求について:どんなに言っても非常に難しいようです。ユーザーがアプリケーションを終了する権限を持っていなくても、システムにRAMが不足している可能性があり、RAMを最も頻繁に使用するサービスであるため、Out of Memory Killerがサービスを終了することを決定することもできます。私の提案は、Restart=always上記の例に含まれている内容を使用して、systemdにクラッシュ/終了時にサービスを再起動させることです。

答え2

後でアクセスできるように、screenコマンドを使用して端末セッションを保存できます。これにより、ターミナルセッションに接続できるプロセスを終了する必要がなくなります。したがって、これは大量のデータ転送を開始したい場合に便利な例です。スクリーンセッションを開始してデータ転送を開始した後、家に帰り、SSHを介して職場のコンピュータに戻り、転送を中断することなくスクリーンセッションにアクセスできます。

インストールするには:

sudo apt install screen UbuntuまたはUbuntuバリアントで利用可能

yum install screenRedhat または Redhat バリアント

だからあなたは実行することができます

screen -S <screen name>新しい画面セッションの作成

screen -ls画面セッションのリスト

screen -r <screen name>特定の画面に添付します。

tmuxはscreenコマンドをゆっくりと置き換えているので、それも見ることをお勧めします。

答え3

完全性と子孫のために最も簡単で明確な答えを追加するだけです(ここで唯一の違いは閉鎖stdin、そうでなければ、以下を含む質問の例と同じです。標準出力/標準入力リダイレクト通事論):

(1)stderrとstdoutに興味がない場合:

$ nohup {prog} </dev/null >/dev/null 2>&1 &  

(2)stderr、stdoutをログに記録したい場合は、

$ nohup {prog} </dev/null >/path/to/out.log 2>&1 &  

(3) stderrとstdoutを別々のファイルに記録したい場合は、

$ nohup {prog} </dev/null >/path/to/out.log 2>/path/to/err.log &

ログを保持するには、起動するたびに例を上書きしてください。たとえば、パスをたどり始めると、日付としてログ名を指定するオプションがありますが、他の回答に示すように、サービスを構成してシステムにout-$(date '+%Y-%m-%d-%H:%M:%S').log作業を実行させることをお勧めします。私はscreen/が好きですtmuxが、実際に端末に再接続したいプロセスをデバッグする場合にのみ可能です。それ以外の場合は、バックグラウンドプロセスとロギングが優先されます。

関連情報