web-dev-qa-db-fra.com

Le déplacement ou le changement de nom d'un fichier exécutable (en particulier un exécutable Windows sous Wine) a-t-il un impact sur son exécution lors de son exécution?

Dans Ubuntu,

  • lors de l'exécution d'un fichier exécutable ou d'un fichier de script, si je déplace ou renomme le fichier, l'exécution sera-t-elle affectée?

  • lors de l'exécution d'un exécutable Windows (par exemple, PDFXCview.exe ) sous wine, le déplacement ou le changement de nom du fichier exécutable Windows aura-t-il un impact sur son exécution sous wine?

Merci.

3
Tim

Les avions sont-ils toujours ravitaillés au sol?

Bien sûr, vous pensez. Mais 0,001% du temps, ils sont ravitaillés en plein vol. Applications militaires par exemple. Donc, la règle n'est pas immuable. La même chose est vraie avec les fichiers exécutables et les scripts. Les virus, par exemple, infectent les exécutables lors de leur exécution et la copie sur le disque. C'est une bonne chose s'ils cassent. Cependant, les non-virus peuvent également mettre à jour des exécutables/scripts.

Exemple de script qui se met à jour

Ce script: Comment faire en sorte qu'un script enregistre dans un fichier séparé le nombre de fois qu'il a été exécuté? se met à jour avec le nombre de fois qu'il a été exécuté.

Classiquement, un fichier de configuration séparé est utilisé pour chaque fichier de script pour enregistrer le nombre de fois qu'il est exécuté. Mais si vous avez des dizaines de scripts, il est logique de stocker le nombre d'exécutions dans le script lui-même. De plus, vous n'avez pas besoin de savoir où le fichier de configuration est stocké ni de modifier le script si le fichier de configuration est déplacé. Le code permettant de modifier le nombre d'exécutions peut être inclus avec une commande source ou . bash afin de réduire les coûts de maintenance et d'améliorer la lisibilité.

Extrait de code

Voici le code pertinent du lien ci-dessus:

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

Décomposer le code

Je vais expliquer rapidement comment fonctionnent les parties de code uniques.

mapfile -t ScriptArr < "$0"

^ Ceci lit le script entier /script/path/script-name.sh dans le tableau nommé ScriptArr.

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

^ Ceci prend l'ancien compte sur la ligne de commentaire: # This script run count: 0 et l'incrémente de 1.

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

^ Ceci écrit le tableau de script modifié sur le disque en tant que nouveau script exécutable. Un effet secondaire sympa (ou mauvais) est la date à laquelle le script a été exécuté pour la dernière fois et la date de modification du script.

Considérations multi-utilisateurs

Notez la variable FLOCKER de la commande ci-dessus:

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

^ Ceci est pour plusieurs utilisateurs. Si un utilisateur exécute le script, il empêche un deuxième utilisateur d'exécuter le même script. Supposons que vous attendiez la fin du travail du premier utilisateur, puis déplacez le script. C'est dommage car le deuxième utilisateur qui était en mode d'attente a maintenant accès à l'exécution du script car le verrouillage du sémaphore est supprimé. Cependant, une fois le travail du premier utilisateur terminé, vous avez déplacé le script dans un autre répertoire. Ce n'est pas grave 99,999% du temps, mais ce sont les rares fois où les bugs sont insondables.

Sommaire

Un script ou un exécutable en cours d'exécution peut se modifier lui-même ou même modifier un autre programme non exécuté dans la même application.

En règle générale, il est sûr à 99% de déplacer (c.-à-d. Renommer) un programme en cours d'exécution. Cela dit je ne ferais jamais ça.

Votre question concerne wine (pseudo-Windows), mais ces scripts bash ont été conçus pour Ubuntu sous Linux et Ubuntu sous Windows (WSL). Le but n'est pas tant de wine mais de montrer ce qui peut être fait dans le monde de la programmation/script.

1
WinEunuuchs2Unix