A movimentação ou renomeação de um arquivo executável (em particular um executável do Windows em Wine) afeta sua execução enquanto está sendo executada?

3

No Ubuntu,

  • ao executar um arquivo executável ou um arquivo de script, se eu mover ou renomear o arquivo, a execução será afetada?

  • ao executar um executável do Windows (por exemplo, PDFXCview.exe ) sob vinho, mover ou renomear o arquivo executável do Windows afeta sua execução no wine?

Obrigado.

    
por Tim 23.03.2018 / 19:50

1 resposta

1

Os aviões são sempre reabastecidos no solo?

Bem, claro que você pensa. Mas, 0,001% do tempo eles são reabastecidos no ar. Aplicações militares por exemplo. Então a regra não é firme. O mesmo acontece com arquivos executáveis e scripts. Os vírus, por exemplo, infectam os executáveis enquanto eles estão em execução e a cópia no disco também. Isso é bom se eles quebrarem. No entanto, os não-vírus também podem atualizar executáveis / scripts.

Exemplo de script que se atualiza

Este script: Como posso fazer com que um script faça o login em um arquivo separado o número de vezes que ele foi executado? se atualiza com o número de vezes que ele foi executado foi executado.

Convencionalmente, um arquivo de configuração separado é usado para cada arquivo de script para registrar quantas vezes ele é executado. Mas se você tiver dezenas e dezenas de scripts, faz sentido armazenar a contagem de execução no próprio script. Além disso, você não precisa controlar onde o arquivo de configuração está armazenado e alterar o script se o arquivo de configuração for movido. O código para modificar a contagem de execuções pode ser incluído com o comando source ou . bash para reduzir os custos de manutenção e melhorar a legibilidade.

Snippet de código

Este é o código relevante do link acima:

# 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"

Quebrando o código

Explicarei rapidamente como as partes de código exclusivas funcionam.

mapfile -t ScriptArr < "$0"

^ Isto lê todo o script /script/path/script-name.sh no array chamado ScriptArr .

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

^ Isso leva a contagem antiga na linha de comentário: # This script run count: 0 e aumenta em 1.

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

^ Isso grava o array de script modificado no disco como o novo script executável. Um bom efeito colateral (ou ruim) é a data em que o script foi executado pela última vez agora é a data de modificação dos scripts.

Considerações sobre vários usuários

Observe a variável FLOCKER do comando acima:

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

^ Isso é para vários usuários. Se um usuário estiver executando o script, ele impedirá que um segundo usuário execute o mesmo script. Digamos que você espere até que o trabalho do primeiro usuário termine e mova o script. Isso é ruim porque o segundo usuário que estava no modo de espera agora obtém acesso para executar o script porque o bloqueio do semáforo é descartado. No entanto, após o término do trabalho do primeiro usuário, você moveu o script para um diretório diferente. Não é grande coisa 99,999% das vezes, mas são os momentos extremamente raros que são os insetos insondáveis.

Resumo

Um script ou executável em execução pode mudar a si mesmo ou até mesmo alterar outro programa que não está em execução no mesmo aplicativo.

Em geral, é 99% seguro mover (renomear) um programa que já está em execução. Dito isso, eu nunca faria isso.

Sua pergunta é sobre wine (pseudo-Windows), mas esses scripts bash foram criados para o Ubuntu no Linux e no Ubuntu no Windows (WSL). O ponto não é muito sobre wine , mas para mostrar o que pode ser feito no mundo da programação / scripting.

    
por WinEunuuchs2Unix 24.03.2018 / 00:22