背景スクリプトをどこに置くのですか?

背景スクリプトをどこに置くのですか?

バックグラウンドで実行し続けたいスクリプトがありますが、どこで起動するのかわかりません。

これを に入れると.bashrc複数回実行されます (ログインするたびに 1 回ずつ)。

これは、ユーザーがログインしている間に実行したいがユーザーごとに何度も実行したくない無限ループです。

答え1

スクリプトはインスタンスが1つしかないことを確認する必要があります。次のようにしてみてください。

#!/bin/bash

mkdir ~/.lock_script || exit
trap "rmdir ~/.lock_script" EXIT

while true
do
    # Do whatever the script does continuously, here....
    #
done

このtrapコマンドは終了時にクリーンアップを担当するため、スクリプトが終了または終了してもクリーンアップされます。どのプロセスもTERM信号(信号9)をトラップ(キャッチ)できないため、kill -9スクリプトを実行するとそれ自体がクリーンアップされません。

カーネルに関する限り、mkdirはアトミックアクションです。 mkdirが成功しなかった場合(ディレクトリがすでに存在する場合)、コマンドはエラーを返し、それによってコマンドの後半が実行されます(例:終了)。

コマンドを「mkdir or else exit」として読み込むことができます。ここでより良い説明があります。http://initialprogramload.blogspot.com/2008/11/single-script-instance.html

また、この方法は使用しないことをお勧めします。while true可能であれば、目的のタスクを実行する別の方法を見つけてください。

答え2

bash(1)ログインシェルで実行している場合(つまり、ユーザーがログインしている場合)を使用して呼び出さない限り、およびが/etc/profile実行~/.bash_profile~/.bash_loginれます。そこからスクリプトがトリックを実行する必要があります。~/.profile--no-profile

答え3

次のように追加の条件を追加できます。

参加する.bashrc

export my_script_pid=myscript.${USER}
[[ ! -f $my_script_pid ]] && { touch $my_script_pid; echo run-script; } || echo "script already running"

次にスクリプトに最後に追加しますrm $my_script_pid

答え4

スクリプトを実行し、以下からログを取得できます。

nohup /path/to/your/script.sh > /dev/null 2>&1 &

また、出力を提供します。

関連情報