web-dev-qa-db-ja.com

実行可能ファイル(特にWineでのWindows実行可能ファイル)の移動または名前変更は、実行中の実行に影響しますか?

Ubuntuでは、

  • 実行可能ファイルまたはスクリプトファイルを実行しているときに、ファイルを移動または名前変更すると、実行に影響がありますか?

  • wineでWindows実行可能ファイル(たとえば PDFXCview.exe )を実行する場合、Windows実行可能ファイルを移動または名前変更すると、wineでの実行に影響しますか?

ありがとう。

3
Tim

飛行機は常に地上で燃料補給されていますか?

もちろんそう思います。しかし、空中で給油される時間の0.001%です。たとえば、軍事用アプリケーション。したがって、ルールは不動のものではありません。同じことが実行可能ファイルとスクリプトにも当てはまります。たとえば、ウイルスは実行中に実行可能ファイルに感染し、ディスク上のコピーも感染します。彼らが壊れたらそれは良いことです。ただし、非ウイルスは実行可能ファイル/スクリプトも更新できます。

自分自身を更新するスクリプトの例

このスクリプト: スクリプトが実行された回数だけ別のファイルにログインさせるにはどうすればよいですか? 実行された回数で自身を更新します。

従来は、スクリプトファイルごとに個別の構成ファイルを使用して、実行回数を記録していました。しかし、数十個のスクリプトがある場合は、スクリプト自体に実行カウントを保存するのが理にかなっています。また、構成ファイルが保存されている場所を追跡したり、構成ファイルが移動した場合にスクリプトを変更したりする必要はありません。実行カウントを変更するコードをsourceまたは. bashコマンドに含めて、メンテナンスコストを削減し、可読性を向上させることができます。

コードスニペット

上記のリンクからの関連コードは次のとおりです。

# This script run count: 0

[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
#     This is useful boilerplate code for Shell scripts.  Put it at the top  of
#     the  Shell script you want to lock and it'll automatically lock itself on
#     the first run.  If the env var $FLOCKER is not set to  the  Shell  script
#     that  is being run, then execute flock and grab an exclusive non-blocking
#     lock (using the script itself as the lock file) before re-execing  itself
#     with  the right arguments.  It also sets the FLOCKER env var to the right
#     value so it doesn't run again.

# Read this script with entries separated newline " " into array
mapfile -t ScriptArr < "$0"

# Build search string that cannot be named
SearchStr="This script"
SearchStr=$SearchStr" run count: "

# Find our search string in array and increment count
for i in ${!ScriptArr[@]}; do
    if [[ ${ScriptArr[i]} = *"$SearchStr"* ]]; then
        OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 )
        NewCnt=$(( $OldCnt + 1 ))
        ScriptArr[i]=$SearchStr$NewCnt
        break
    fi
done

# Rewrite our script to disk with new run count
# BONUS: Date of script after writing will be last run time
printf "%s\n" "${ScriptArr[@]}" > "$0"

コードを分解する

独自のコード部分がどのように機能するかを簡単に説明します。

mapfile -t ScriptArr < "$0"

^これはスクリプト/script/path/script-name.sh全体をScriptArrという名前の配列に読み込みます。

OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 )
NewCnt=$(( $OldCnt + 1 ))
ScriptArr[i]=$SearchStr$NewCnt

^これはコメント行の古いカウントを取ります:# This script run count: 0そして1ずつ増加します。

printf "%s\n" "${ScriptArr[@]}" > "$0"

^これにより、変更されたスクリプト配列が新しい実行可能スクリプトとしてディスクに書き込まれます。良い(または悪い)副作用は、スクリプトが最後に実行された日付がスクリプトの変更日になることです。

マルチユーザーの考慮事項

上記のコマンドのFLOCKER変数に注目してください。

[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :

^これは複数のユーザー向けです。 1人のユーザーがスクリプトを実行している場合、2人目のユーザーがまったく同じスクリプトを実行するのを停止します。最初のユーザーのジョブが終了するまで待ってから、スクリプトを移動するとします。セマフォロックが解除されるため、待機モードになっていた2番目のユーザーがスクリプトを実行するためのアクセス権を取得するため、これは悪いことです。ただし、最初のユーザーのジョブが終了した後、スクリプトを別のディレクトリに移動しました。たいした99.999%の時間ではありませんが、計り知れないバグは非常にまれな時間です。

概要

実行中のスクリプトまたは実行可能ファイルは、それ自体を変更することも、同じアプリケーション内で実行されていない別のプログラムを変更することもできます。

一般的に言って、すでに実行中のプログラムを移動(名前変更)することは99%安全です。それは私がそれを決してしないと言った。

あなたの質問はwine(擬似Windows)についてですが、これらのbashスクリプトはLinux下のUbuntuおよびWindows下のUbuntu(WSL)用に設計されています。ポイントはwineについてではなく、プログラミング/スクリプトの世界で何ができるかを示すことです。

1