GNU/Linux >> Linux の 問題 >  >> Linux

シェルでプロセスをデーモン化しますか?

デーモンに関するウィキペディアの記事から:

Unix 環境では、デーモンの親プロセスは多くの場合、常にではありませんが、init プロセスです。デーモンは通常、プロセスが子プロセスをフォークしてすぐに終了し、init に子プロセスを採用させるか、またはデーモンを直接起動する init プロセスによって作成されます。さらに、フォークして終了することによって起動されたデーモンは、通常、制御端末 (tty) からプロセスを分離するなど、他の操作を実行する必要があります。このような手順は、多くの場合、Unix の daemon(3) などのさまざまな便利なルーチンで実装されています。

daemon のマンページを読む 関数。

すぐに終了するシェルからバックグラウンド コマンドを実行すると、プロセスの PPID が 1 になります。簡単にテストできます:

# bash -c 'nohup sleep 10000 &>/dev/null & jobs -p %1'
1936
# ps -p 1936
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     1936       1    9104       9552  cons0       1009 17:28:12 /usr/bin/sleep

ご覧のとおり、プロセスは PID 1 によって所有されていますが、TTY に関連付けられています。このログイン シェルからログアウトした場合は、再度ログインして ps を実行します。 繰り返しますが、TTY は ? になります。 .

TTY から切り離すことが重要な理由については、こちらをお読みください。

setsid の使用 (util-linux の一部 ):

# bash -c 'cd /; setsid sleep 10000 </dev/null &>/dev/null & jobs -p %1'
9864
# ps -p 9864
      PID    PPID    PGID     WINPID   TTY         UID    STIME COMMAND
     9864       1    9864       6632  ?           1009 17:40:35 /usr/bin/sleep

stdin、stdout、および stderr をリダイレクトする必要さえないと思います。


Linux
  1. JVMデーモン?

  2. 「ls」を実行するために別のプロセスが必要なのはなぜですか?

  3. Python で親プロセスの環境を変更することは可能ですか?

  1. プログラムでAndroidでシェルコマンドを実行する方法はありますか?

  2. pthread_exit と return

  3. シェルスクリプトでフォークされた子プロセスから PID を取得する方法

  1. ゾンビプロセスの作成

  2. popen() がシェルを呼び出してプロセスを実行するのはなぜですか?

  3. シェルに関係なくプロセスを実行できますか?