
私は systemd バージョン 231-9 の Debian Stretch を使用しています。
ログアウトした場合でも、いくつかのシェル スクリプトと非デーモン プログラムをバックグラウンドで実行する必要があります。
以前は、LSB ヘッダー付きの簡単な init.d スクリプトを作成し、開始オプション付きの case で単に「my_script.sh >> /var/log/my_script.log 2>&1 &」を実行して、my_script.sh をバックグラウンドで実行していましたが、今では、&、nohup、setsid、disown のどれを試しても、ターミナルを閉じると Systemd によってスクリプトが強制終了されます。
任意のスクリプトまたは非デーモン プログラムをデーモンとして実行するための適切な init.d スクリプトのレシピを教えていただけますか?
ありがとう。
答え1
あなたの所有物が root ユーザーである場合、次のようになります/etc/rc.local
:
screen -dmS ThingOne /path/to/thing-one
screen -dmS ThingTwo /path/to/thing-two
または、任意のユーザー (root を含む) の場合は、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