シェルスクリプトをデーモンとして実行する起動スクリプト

シェルスクリプトをデーモンとして実行する起動スクリプト

私はDebian Stretchとsystemdバージョン231-9を使用しています。

ログアウトするときも、バックグラウンドで一部のシェルスクリプトとデーモン以外のプログラムを実行する必要があります。

私はLSBヘッダーを持つ単純なinit.dスクリプトを作成し、起動オプションを使用して単に "my_script.sh >> /var/log/my_script.log 2>&1&"を実行してmy_script.shをバックグラウンドで実行しましたが、今Systemdは、端末を閉じると、何を試しても、それらを殺します。 &, nohup, setid, disown.

スクリプトやデーモン以外のプログラムをデーモンとして実行するための正しいinit.dスクリプトのレシピを提供するのに役立ちますか?

ありがとうございます。

答え1

あなたのものがルート所有の場合は、次のことを行います/etc/rc.local

screen -dmS ThingOne /path/to/thing-one
screen -dmS ThingTwo /path/to/thing-two

または、すべてのユーザー(ルートを含む)の場合は、cronテーブルで次の操作を行います。

@reboot screen -dmS ThingOne /path/to/thing-one
# et cetera

答え2

スクリプトをデーモンに設定する方法は次のとおりです。

#! /bin/sh

### BEGIN INIT INFO
# Provides:          foobar
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: foobar
# Description:       more foo for your bars
### END INIT INFO

# Carry out specific functions when asked to by the system
case "$1" in
  start)
    echo "Starting foobar "

    # example 1 - system service
    # /usr/bin/foobar --config /etc/foo.conf start

    # example 2 - run script as user
    # su --login mkaz --command "/home/mkaz/bin/my-script --cmd-args"

    ;;
  stop)
    echo "Stopping foobar"

    # example 1
    # /usr/bin/foobar --config /etc/foo.conf stop

    ;;
  *)
    echo "Usage: /etc/init.d/foobar {start|stop}"
    exit 1
    ;;
esac

exit 0

その後、スクリプトをinit.dフォルダに移動して実行可能にします。

sudo mv foobar /etc/init.d/       # move to init.d
sudo chmod 755 /etc/init.d/foobar # make executable

起動時にスクリプトを起動するには:

update-rc.d foobar defaults 

起動時にスクリプトを削除するには、次の手順を実行します。

update-rc.d -f foobar remove

スクリプトを手動で開始するには、次のようにします。

service foobar start

源泉:https://debian-administration.org/article/28/Making_scripts_run_at_boot_time_with_Debian

関連情報