Перемещение или переименование исполняемого файла (в особенности исполняемый файл Windows под Вином) влияют на свое выполнение, в то время как это выполняется?

В Ubuntu,

  • при выполнении исполняемого файла или файла сценария, если я перемещаю или переименовываю файл, повлияют на выполнение?

  • при выполнении исполняемого файла Windows (например, PDFXCview.exe) под вином, будет, перемещаясь, или переименование исполняемого файла Windows влияет на свое выполнение под вином?

Спасибо.

3
задан 24 March 2018 в 03:07

1 ответ

Самолеты всегда дозаправляются на земле?

Хорошо, конечно, Вы думаете. Но.001% времени они дозаправляются в воздушном пространстве. Военные применения, например. Таким образом, правило не устойчиво. То же верно с исполняемыми файлами и сценариями. Вирусы, например, заражают исполняемые файлы, в то время как они работают и копия на диске также. Это - хорошая вещь, если они повреждаются. Однако невирусы также могут обновить исполняемые файлы / сценарии.

Пример сценария, который обновляет себя

Этот сценарий: Как я могу заставить сценарий входить в систему отдельный файл количество раз, оно было выполнено? обновляет себя с количеством раз, оно было выполнено.

Традиционно отдельный конфигурационный файл используется, чтобы каждый файл сценария записал, сколько раз он выполняется. Но если у Вас есть десятки на десятки сценариев, имеет смысл хранить количество выполнения в самом сценарии. Кроме того, Вы не должны отслеживать то, где конфигурационный файл хранится и изменение сценария, если конфигурационный файл перемещен. Код для изменения количества выполнения может быть включен с a source или . колотите команду, чтобы уменьшить затраты на обслуживание и улучшить удобочитаемость.

Фрагмент кода

Вот соответствующие нормы из ссылки выше:

# 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" "$@" || :

^ Это для многочисленных пользователей. Если один пользователь запускает скрипт, он мешает второму пользователю запустить тот же самый скрипт. Скажем, Вы ожидаете до концов задания первого пользователя и затем перемещаете сценарий. Это плохо, потому что второй пользователь, который был в режиме ожидания теперь, заставляет доступ запускать скрипт, потому что семафорная блокировка отбрасывается. Однако после того, как задание первого пользователя закончило Вас, переместил сценарий в другой каталог. Не грандиозное предприятие 99,999% времени, но, это - чрезвычайно редкие времена, которые являются непостижимыми ошибками.

Сводка

Под управлением сценарий или исполняемый файл могут изменить себя или могут даже быть изменением другая программа, это не выполнение в рамках того же приложения.

Вообще говоря, это - 99%-й сейф, чтобы переместить (т.е. переименовать) программа, которая уже работает. Это сказало, что я никогда не буду делать этого.

Ваш вопрос о wine (псевдо-Windows), но эти сценарии удара был разработан для Ubuntu в соответствии с Linux и Ubuntu в соответствии с Windows (WSL). Точка не так о wine но показать, что может быть сделано в программировании / мир сценариев.

1
ответ дан 1 December 2019 в 17:28

Другие вопросы по тегам:

Похожие вопросы: