シェルスクリプトをデーモンとして実行する「正しい」方法

シェルスクリプトをデーモンとして実行する「正しい」方法

文章を書いていますシェルスクリプト起動時にデーモンとして実行したいです。外部ツールは使用されません。デーモンツールまたは悪魔


Linuxデーモンの作成HOWTO

~によるとLinuxデーモンの作成HOWTO、ㅏ適切デーモンプロセスには次の特徴があります。

  • フォーク親プロセスで
  • 閉鎖みんなファイル記述子(つまりstdin、、、、stdoutstderr
  • 開いている丸太書き込み用(設定されている場合)
  • 変更タスクリスト継続的(通常/
  • 初期化ファイルモードマスク(マスク)
  • ユニークな作りセッションID(セキュリティ識別番号)

悪魔紹介する

これ悪魔紹介するさらに一歩進んで、一般的なデーモンは次の点を指摘しています。

  • それとの関係を切る制御端子(存在する場合)すべてを無視します。端末信号
  • それとの関係を切るプロセスグループ
  • ハンドルSIGCLD

一般的なLinuxツールのみを使用して、またはshスクリプトでdashこれらすべての操作をどのように実行できますか?bash

スクリプトは、追加のソフトウェアなしでできるだけ多くのディストリビューションで実行できる必要があります。ダーバン私たちの主な焦点です。


メモ:オンラインに多くの答えがあることを知っています。スタック交換nohupネットワークでは、または使用をお勧めしsetsidますが、これらの方法のいずれも上記の要件をすべて満たすことはできません。


編集する:これDaemon(7) マンページSysV古いスタイルデーモンと新しいスタイルsystemdデーモンとの間にわずかな違いがあるように見えますが、いくつかのガイドラインもあります。さまざまなディストリビューションとの互換性が重要であるため、回答の違いを明確に説明する必要があります。


ベストアンサー1

使用システム単純なユニットを作成してスクリプトをデーモンとして実行できる必要があります。いろいろあるオプション追加できますが、これは非常に簡単です。

スクリプトがあるとしましょう/usr/bin/mydaemon

#!/bin/sh

while true; do
  date;
  sleep 60;
done

忘れないでくださいsudo chmod +x /usr/bin/mydaemon

単位を作成します/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

もしsystemdベースのシステム(今日のほとんどのLinuxディストリビューションの場合と同様)では、これは実際には外部ツールではありません。欠点は、どこでも動作しないことです。

おすすめ記事