daemontoolsのような外部ツールを使用せずに、起動時にデーモンとして実行したいShellスクリプトを書いています または daemonize。
Linux Daemon Writing HOWTO によると、properデーモンには次の特性があります。
stdin
、stdout
、stderr
)/
)daemonizeはじめに はさらに進んで、一般的なデーモンも次のように述べています。
SIGCLD
を処理します一般的なLinuxツールのみを使用して、sh
、dash
、またはbash
スクリプトでこれらすべてを行うにはどうすればよいですか?
Debianが主な焦点ですが、スクリプトは追加のソフトウェアなしでできるだけ多くのディストリビューションで実行できるはずです。
注:StackExchangeネットワークには、Nohup
またはsetsid
の使用を推奨する多くの回答があります、しかしこれらの方法はいずれも上記の要件のすべてに対処していません。
EDIT:daemon(7)マンページ もいくつかのポインタを提供しますが、古いスタイルのSysV
デーモンと新しいスタイルの間にはいくつかの違いがあるようですsystemd
ones。さまざまなディストリビューションとの互換性が重要であるため、答えが違いを明確にするようにしてください。
systemd を使用すると、単純なユニットを作成することにより、スクリプトをデーモンとして実行できるはずです。さまざまな options を追加できますが、これは簡単に取得できます。
スクリプトがあるとします/usr/bin/mydaemon
。
#!/bin/sh
while true; do
date;
sleep 60;
done
ユニットを作成します/etc/systemd/system/mydaemon.service
。
[Unit]
Description=My daemon
[Service]
ExecStart=/usr/bin/mydaemon
Restart=on-failure
[Install]
WantedBy=multi-user.target
悪魔を開始するには、実行します
systemctl start mydaemon.service
起動時に開始するには、それを有効にします
systemctl enable mydaemon.service
if今日のLinuxディストリビューションの大部分であるsystemdベースのシステムでは、これは実際には外部ツールではありません。ただし、どこでも機能しない場合があります。
私はおそらくここで何かを見逃している。なぜNohup
が適切ではないのですか?もちろん、それだけでは十分ではありませんaloneですが、補足するのは簡単なようです。
#!/bin/bash
if [ "$1" = "DAEMON" ]; then
# is this necessary? Add other signals at will (TTIN TTOU INT STOP TSTP)
trap '' INT
cd /tmp
shift
### daemonized section ######
for i in $( seq 1 10 ); do
date
sleep 5
done
#### end of daemonized section ####
exit 0
fi
export PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin
umask 022
# You can add Nice and ionice before Nohup but they might not be installed
Nohup setsid $0 DAEMON $* 2>/var/log/mydaemon.err >/var/log/mydaemon.log &
私が見る限り:
stdin
は親スクリプトの最後で終了します。init
(またはsystemd
)に変更されます当たり前のところを逃してしまった気がします。反対票を投じますが、それを教えてください:-)
ほとんどのディストリビューションに含まれるLinux screen
コマンドは、シェルスクリプトをデーモン化できます。よく使います。切り離された画面セッションを開始、一覧表示、終了する簡単な例を次に示します...
# screen -dmS Session_Name bash -c "while true; do date; sleep 60; done"
# screen -ls
There are screens on:
8534.Session_Name (04/04/2018 08:46:27 PM) (Detached)
# screen -S Session_Name -X quit