
スクリプトがあるフォルダーからファイルを実行し、いくつかの構成ファイルを渡し、同じフォルダーにログを出力するスクリプトをBashで実行しました。たとえば、次のような構造になります。
/home/user/application
内部には次のファイルがあります。
script.sh # this would be the script to launch
executablefile # this would be the file to run, it's called by the script as "./executable", since it's not in $PATH
config.json # a config file for the executable that is passed by the script using arguments
logfile # A log file written by the script, redirecting all Standard and Error output to the log file using tee
したがって、CDをフォルダに挿入してスクリプトを実行すると、すべてがうまくいきます。ただし、別の場所でこのスクリプトを呼び出すと実行可能ファイルが見つからず、構成を検索して呼び出された場所からログファイルを出力する可能性があります。これは私が望むものではありません。
では、shスクリプトにどのような変更を加えることができますか?スクリプトの起動時にスクリプトディレクトリを作業ディレクトリとして作成するには?
私の主なアイデアは、後でこのスクリプトを呼び出すシステムサービスファイルを作成することです。
ありがとうございます。
答え1
次の2つのことができます。
スクリプトでは絶対パスを使用します。つまり、
./executablefile
到着
/home/user/application/executablefile
スクリプトの実行時に作業ディレクトリを設定します。ユニットにしたいと言われました
systemd
。この場合、サービスセクションは次のようになります。[Service] Type=forking ExecStart=/home/user/application/script.sh WorkingDirectory=/home/user/application
また、起動スクリプトで実行する操作はsystemdで実行できることがよくあります。環境変数chrt
や依存関係などの操作を構成で実行できるため、systemd
起動スクリプトは必要ありません。
また、通常は実行可能ファイルをに移動し/usr/local/bin
、ログファイルに書き込み可能なスペースを残し、/var
jsonをまたは/etc
に移動する~/.config
ことをお勧めします。をコンパイルする場合は、コマンドライン引数を使用して名前をexecutablefile
付けることをお勧めします。logfile
etcfile
答え2
実行可能ファイルが見つかりません
シェルは次のコマンドを使用して別のコマンドを検索します。パス変数。しかし、実行ファイルパスに設定ファイルを保存するのは良い習慣ではありません。
実行可能ファイルが見つかりません
方法を言うと、次のようになります。
MYDIR=$( dirname ( realpath "$BASH_SOURCE[0]" ))
# Above gets the path of the current script, cleans it up and removes the
# script filename and preceding '/'
"$MYDIR/executablefile" "$MYDIR/config.json" >> "$MYDIR/logfiles"
ただし、一般的な慣行は、定義された場所に設定を配置するか(これには規則がある)、それをコマンドライン引数として渡すことです。