Récupérer un script en cours d'execution

Le
Goldy
Bonsoir à tous,

J'ai accidentellement effacé un script bash en cours d'exécution suite à
une erreur bête avec la commande mv (je l'ai écrasé avec un fichier de
8go)

Je constate que le script semble continuer de s'exécuter normalement, et
je me demandais donc s'il existait pas un quelconque moyen d'obtenir la
version en mémoire du script actuellement en cours d'exécution.

Je sais, j'aurais du faire un backup, en réalité j'en ai un, sauf qu'il
s'agit d'une ancienne version et que je manque de courage de réécrire
toute les modifications que j'ai apporté à ce script (ça fait plusieurs
centaines de lignes)

J'ai pourtant l'habitude de ne pas travailler sur les scripts à exécuter
mais toujours sur une copie de ces derniers, et je sais pas pourquoi
là la flemme sans doute.

Merci d'avance si quelqu'un peu m'aider.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers debian-user-french-REQUEST@lists.debian.org
En cas de soucis, contactez EN ANGLAIS listmaster@lists.debian.org
Archive: http://lists.debian.org/4C11914E.8020704@goldenfish.info
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Basile Starynkevitch
Le #22239951
On Fri, 2010-06-11 at 03:28 +0200, Goldy wrote:
Bonsoir à tous,

J'ai accidentellement effacé un script bash en cours d'exécutio n suite à
une erreur bête avec la commande mv (je l'ai écrasé avec u n fichier de
8go...)

Je constate que le script semble continuer de s'exécuter normalement , et
je me demandais donc s'il existait pas un quelconque moyen d'obtenir la
version en mémoire du script actuellement en cours d'exécution.




Peut-être que /proc/<pid-du-shell>/fd/ pourrait aider?

Mais je n'en sais rien!


--
Basile STARYNKEVITCH http://starynkevitch.net/Basile/
email: basile<at>starynkevitch<dot>net mobile: +33 6 8501 2359
8, rue de la Faiencerie, 92340 Bourg La Reine, France
*** opinions {are only mines, sont seulement les miennes} ***


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Sylvain Sauvage
Le #22240051
Basile Starynkevitch, vendredi 11 juin 2010, 07:37:50 CEST

On Fri, 2010-06-11 at 03:28 +0200, Goldy wrote:
> Bonsoir à tous,
>
> J'ai accidentellement effacé un script bash en cours d'exécut ion suite à
> une erreur bête avec la commande mv (je l'ai écrasé avec un fichier de
> 8go...)
>
> Je constate que le script semble continuer de s'exécuter normaleme nt, et
> je me demandais donc s'il existait pas un quelconque moyen d'obtenir la
> version en mémoire du script actuellement en cours d'exécutio n.


Peut-être que /proc/<pid-du-shell>/fd/ pourrait aider?

Mais je n'en sais rien!



Non, le shell conserve bien le fd du fichier script mais,
dans /proc/<pid>/fd/, c’est un lien symbolique.

Sinon, il reste /dev/mem à parcourir ou bien essayer de
retrouver les inodes du fichier sur le disque…

--
Sylvain Sauvage

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
giggzounet
Le #22240081
Le 11/06/2010 08:26, Sylvain Sauvage a écrit :
Basile Starynkevitch, vendredi 11 juin 2010, 07:37:50 CEST

On Fri, 2010-06-11 at 03:28 +0200, Goldy wrote:
Bonsoir à tous,

J'ai accidentellement effacé un script bash en cours d'exécution suite à
une erreur bête avec la commande mv (je l'ai écrasé avec un fichier de
8go...)

Je constate que le script semble continuer de s'exécuter normalement, et
je me demandais donc s'il existait pas un quelconque moyen d'obtenir la
version en mémoire du script actuellement en cours d'exécution.




Peut-être que /proc/<pid-du-shell>/fd/ pourrait aider?

Mais je n'en sais rien!



Non, le shell conserve bien le fd du fichier script mais,
dans /proc/<pid>/fd/, c’est un lien symbolique.

Sinon, il reste /dev/mem à parcourir ou bien essayer de
retrouver les inodes du fichier sur le disque…




peut être que ext3grep peut aider si tu as ext3. je n'ai jamais utilisé,
mais ça a l'air po mal.

Bye

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/husm97$p6o$
Jacques-Daniel PILLON
Le #22241971
Le vendredi 11 juin 2010 à 03:28 +0200, Goldy a écrit :
Bonsoir à tous,




Bonjour,

il est possible de générer un fichier core avec la commande gcore
(paquet gdb) :

$ gcore PID

D'après mes tests, le fichier core généré contient le code source du
script bash exécuté.

Procédure de test :

Fichier test.sh :

#!/bin/sh

while(true) ; do
echo "toto"
sleep 2
done

Script lancé dans un terminal, puis le fichier source supprimé :

:~$ lsof | grep test.sh | grep deleted
test.sh 20157 jdpillon 10r REG 8,17 55
344084 /home/jdpillon/bin/test.sh (deleted)
:~$

Création du fichier core :

:~$ gcore 20157
0x001ad422 in __kernel_vsyscall ()
Saved corefile core.20157
:~$

Le fichier core.20157 contient le code source du fichier test.sh. En
utilisant grep, sed, ou autre il doit être possible de ne récupérer que
le code source au milieu de ce fichier binaire.

Le fait d'utiliser gcore n'affecte en rien le processus.

Cordialement

--
Jacques-Daniel PILLON

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Goldy
Le #22248391
Le 11/06/2010 14:47, Jacques-Daniel PILLON a écrit :
Le vendredi 11 juin 2010 à 03:28 +0200, Goldy a écrit :
Bonsoir à tous,




Bonjour,

il est possible de générer un fichier core avec la commande gcore
(paquet gdb) :

$ gcore PID

D'après mes tests, le fichier core généré contient le code source du
script bash exécuté.

Procédure de test :

Fichier test.sh :

#!/bin/sh

while(true) ; do
echo "toto"
sleep 2
done

Script lancé dans un terminal, puis le fichier source supprimé :

:~$ lsof | grep test.sh | grep deleted
test.sh 20157 jdpillon 10r REG 8,17 55
344084 /home/jdpillon/bin/test.sh (deleted)
:~$

Création du fichier core :

:~$ gcore 20157
0x001ad422 in __kernel_vsyscall ()
Saved corefile core.20157
:~$

Le fichier core.20157 contient le code source du fichier test.sh. En
utilisant grep, sed, ou autre il doit être possible de ne récupérer que
le code source au milieu de ce fichier binaire.

Le fait d'utiliser gcore n'affecte en rien le processus.

Cordialement

--
Jacques-Daniel PILLON




Je viens d'essayer, mais malheureusement le code source est complètement
noyé dans un tas de donnés binaires qu'il est difficile de filtrer (ça
contient également le contenu des variables... et comme le script est un
serveur d'encodage vidéo, c'est un sacré foutoir).

Je crois que j'aurais plus vite fait de réécrire ce que j'avais modifié
dans le script, je me vois mal m'amuser avec des expressions régulières
pour extraire ça.

Merci quand même.

Ha sinon, une question HS tant que je peux la poser. J'ai lu dans une
documentation sur bash que ce langage était déconseillé pour développer
des applications de type daemon ou serveur, mais sans expliquer
pourquoi. Le bash est pourtant très robuste et permet d'éviter bon
nombre de bug que l'on pourrait avoir avec un langage compilé, est-ce
que quelqu'un saurait pourquoi cette recommandation ?


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Yves Rutschle
Le #22249161
Ha sinon, une question HS tant que je peux la poser. J'ai lu dans une
documentation sur bash que ce langage était déconseillé pour développer
des applications de type daemon ou serveur, mais sans expliquer
pourquoi. Le bash est pourtant très robuste et permet d'éviter bon
nombre de bug que l'on pourrait avoir avec un langage compilé, est-ce
que quelqu'un saurait pourquoi cette recommandation ?



C'est lent et n'est pas très efficace en terme d'utilisation
mémoire, mais ça n'empèche pas certains d'écrire des sites
entiers avec (pis aujourd'hui personne ne se gène pour faire
du Java coté serveur, alors...)

Y.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Goldy
Le #22249391
Le 11/06/2010 08:26, Sylvain Sauvage a écrit :
Basile Starynkevitch, vendredi 11 juin 2010, 07:37:50 CEST

On Fri, 2010-06-11 at 03:28 +0200, Goldy wrote:
Bonsoir à tous,

J'ai accidentellement effacé un script bash en cours d'exécution suite à
une erreur bête avec la commande mv (je l'ai écrasé avec un fichier de
8go...)

Je constate que le script semble continuer de s'exécuter normalement, et
je me demandais donc s'il existait pas un quelconque moyen d'obtenir la
version en mémoire du script actuellement en cours d'exécution.




Peut-être que /proc/<pid-du-shell>/fd/ pourrait aider?

Mais je n'en sais rien!



Non, le shell conserve bien le fd du fichier script mais,
dans /proc/<pid>/fd/, c’est un lien symbolique.

Sinon, il reste /dev/mem à parcourir ou bien essayer de
retrouver les inodes du fichier sur le disque…





En réalité, ça marche quand même. Après quelques échanges en privés avec
Jacques-Daniel Pillon, il a eu la très bonne idée de faire un essai, et
cela a fonctionné.

J'ai pu récupérer le script avec cette méthode.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Publicité
Poster une réponse
Anonyme