バックグラウンドで実行し続けたいスクリプトがありますが、どこで起動するのかわかりません。
これを に入れると.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 &
また、出力を提供します。