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


9

http://linuxg.net/how-to-transform-a-process-into-a-daemon-in-linux-unix/は、bashでプロセスをデーモン化する例を示しています。

$ nohup firefox& &> /dev/null

私が正しい場合、コマンドは「nohup and background a process」と同じです。しかし、デーモンはnohuppedおよびバックグラウンドプロセス以上のものではありませんか?

プロセスをデーモン化するためにここで欠落している手順は何ですか?

たとえば、プロセスをデーモン化するときに親プロセスを変更する必要はありませんか?はいの場合、どのようにbashでそれを行いますか?関連する返信https://unix.stackexchange.com/a/177361/674を理解しようとしています

他にどのようなステップと条件がありますか?

私の関連する質問を参照してくださいhttps://stackoverflow.com/q/35705451/156458


1
デーモンの定義に依存します。端末から切り離されたバックグラウンドで実行するだけの場合は、Firefoxをデーモンとして実行しています。ただし、「標準」デーモンは通常、ユーザーによって実行されず、initスクリプトとロギングを備え、通常は何らかのセキュリティを備えており、UbuntuまたはFedora(または同様のもの)を実行しているかどうかに応じて、通常はapparmorまたはselinuxを使用します。linfo.org/daemon.htmlを参照してください。
パンサー

1
start-stop-daemon Debianを見てください。私はここで、スタックオーバーフローからの関連スレッド残すstackoverflow.com/questions/16139940/...生のmanページよりも興味深いものです
ルイFリベイロ

回答:


10

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

Unix環境では、デーモンの親プロセスは、多くの場合(常にではありませんが)initプロセスです。デーモンは通常、子プロセスをforkしてすぐに終了して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をリダイレクトする必要さえないと思います。


3
daemonizeを見てください。優れたツールのほかに、デーモンとは何かについてかなり良い説明があります。
ジーンパブロフスキー2016

プロセスが生成されたシェルからログアウトせずにttyからプロセスの関連付けを解除する方法を知っているなら、私は興味がありますか?
StoneThrow 2017

1
@StoneThrow「プロセスが生成されたシェルからログアウトせずに」bash -cラッパーを使用する場合、プロセスに関連付けられたTTYはありません。それは本当に彼がそれを示したようなものです。
Bruno Bronosky、2018

@StoneThrowですが、このテストをecho "outer tty: $(tty)"; ls -la $(dirname $(tty)); bash -c 'echo "inner tty: $(tty)"; ls -la $(dirname $(tty));'行うと、両方のTTYがまったく同じであることがわかりますが、TTYを取得するという実証された動作は、?「シェルからログアウト」したり、TTYを閉じたりしていなくても発生します。
Bruno Bronosky

-1

デーモンは、その名のとおり、1まで実行されるプログラムにすぎませんシステムがシャットダウンされます。2.停止するように要求されます。それ以外には、魔法の意味はありません。

この状況では、bashスクリプトをnohupを使用してバックグラウンドで実行すると、それをデーモンプロセスとして分類できます。

あなたが見つけることを期待し、見つけないことは何ですか?問題が発生した場合は、サンプルコードとサンプルデータセグメントを記載して、さらに助けを求めてください。現時点でのあなたの質問は、広すぎる/一般的すぎます。


ありがとう。私の投稿には、あなたが最後の段落で求めたすべてが含まれていると思います。
ティム

4
うーん、これは真実ではありません。デーモンには、制御ターミナル、stdoutまたはstderrなどがありません。software.clapper.org/daemonize
Rich Homolka
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.