Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 15/09/2017, à 17:05

Jean-Luc GARNIER

Connaitre l'état d'une commande rsync

Bonjour à tou(te)s,

Je tente d'initialiser un serveur ownCloud en ligne (sur un serveur virtuel VPS chez OVH) à partir des fichiers déjà présents sur un NAS, qui va ensuite devenir un backup du cloud privé. Pour ceci, j'ouvre une session SSH sur le NAS via un terminal sur mon poste (je suis à 200km de la machine), je lance une commande rsync du NAS vers le VPS qui démarre correctement mais va mettre plus d'une journée à terminer la synchro.

Ma question : comme je sors ensuite du terminal et éteins mon PC, la commande rsync se poursuit-elle sans action du terminal ?
Corollaire : si je rouvre une session SSH sur le NAS, comment puis-je connaitre l'état de la commande rsync (peut-être encore en cours d'exécution) ? Y a-t-il un log généré que je pourrais consulter pour savoir si des fichiers ont présenté des erreurs ?

Merci d'avance pour toute aide !

Hors ligne

#2 Le 15/09/2017, à 17:26

Zakhar

Re : Connaitre l'état d'une commande rsync

Si tu peux avoir screen sur ton NAS c'est super facile (et screen est un outil indispensable pour NAS !)

Tu commences par ouvrir une session SSH de ton PC vers ton NAS, puis tu lances

screen

Ensuite dans ce "screen" tu lances les commandes que tu veux sur le NAS  (par exemple un rsync) et une fois la commande lancée tu "détaches" le screen (CTRL+A D).

Si tu as plusieurs commandes à lancer en parallèle tu peux le faire en ouvrant de nouveaux terminaux dans screen avec CTRL+A C, et basculer d'un à l'autre par leur numéro CTRL+A (numéro)

A partir de là tu peux couper le SSH et ton PC.

Ensuite si tu veux voir où ça en est, il suffit de rallumer ton PC, relancer une session SSH vers ton NAS, et "reprendre" le screen avec

screen -r

Tu auras alors à l'écran le stdout de rsync (ou de n'importe quoi d'autre que tu aurais lancé).

Sans screen tu peux faire la même chose en beaucoup moins pratique en mettant les commandes en tâche de fond.

Documentation : http://doc.ubuntu-fr.org/screen

Dernière modification par Zakhar (Le 15/09/2017, à 17:33)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#3 Le 15/09/2017, à 17:46

Jean-Luc GARNIER

Re : Connaitre l'état d'une commande rsync

Merci beaucoup Zakhar pour cette réponse rapide !

Donc, si je comprends bien, n'ayant pas utilisé screen ni mis la tâche rsync en tâche de fond (je ne sais pas comment d'ailleurs wink), celle-ci s'est interrompue quand j'ai fermé mon terminal, c'est ça ? Je n'ai plus qu'à tout relancer sinon...

Hors ligne

#4 Le 15/09/2017, à 22:38

Zakhar

Re : Connaitre l'état d'une commande rsync

Absolument !

Lorsque tu lances une tâche depuis un terminal, cette tâche est "fils" du shell qui l'a lancé (bash en général) lequel est fils du terminal (ou de SSH pour ton cas). Si tu termines le terminal/SSH, le shell (bash) se termine et la tâche que tu as lancée se termine en même temps parce que son "parent" disparaît.

Si tu ne veux pas que cela arrive, il faut "détacher" la tâche du parent. Screen le fait automatiquement.

Sans screen, tu dois le faire "à la main", c'est à dire lancer la tâche en mode "détaché du parent".

En général en procédant ainsi cela fonctionne :

nohup program options 1>/dev/null 2>/dev/null 0</dev/null &

Pour comprendre ça, un utilitaire sympa est htop qui te permet d'avoir une vue en arbre avec F5.

Sinon un petit jeu :
- tu ouvres un terminal et tu lances

sleep 3m

- tu ouvres un deuxième terminal (ou onglet sur gnome-terminal par CTRL+Shift+T)

$ ID=$(pidof sleep); if [ -z $ID ]; then echo "No process"; else while :; do ps --pid $ID -f | tail -n1; [ $ID -eq 1 ] && break; ID=$(ps --pid $ID -o ppid | tail -n1); done; fi
myself    6521  6511  0 23:28 pts/1    00:00:00 sleep 3m
myself    6511  2792  0 23:28 pts/1    00:00:00 bash
myself    2792  2496  1 23:02 ?        00:00:23 /usr/lib/gnome-terminal/gnome-terminal-server
myself    2496  2267  0 22:12 ?        00:00:00 /sbin/upstart --user
root      2267  1949  0 22:11 ?        00:00:00 lightdm --session-child 12 19
root      1949     1  0 22:11 ?        00:00:00 /usr/sbin/lightdm
root         1     0  0 22:11 ?        00:00:02 /sbin/init splash

Tu vois, on remonte du sleep vers les parents, le parent initial étant le process 1 'init'.

Maintenant, tu fermes le terminal contenant sleep, et tu as:

$ ID=$(pidof sleep); if [ -z $ID ]; then echo "No process"; else while :; do ps --pid $ID -f | tail -n1; [ $ID -eq 1 ] && break; ID=$(ps --pid $ID -o ppid | tail -n1); done; fi
No process

On constate donc que le sleep a disparu en fermant le terminal, conformément aux explications ci-dessus.

On refait de même, mais cette fois dans le premier terminal, au lieu de lancer sleep tout seul :

nohup sleep 3m 1>/dev/null 2>/dev/null 0</dev/null &
$ ID=$(pidof sleep); if [ -z $ID ]; then echo "No process"; else while :; do ps --pid $ID -f | tail -n1; [ $ID -eq 1 ] && break; ID=$(ps --pid $ID -o ppid | tail -n1); done; fi
myself    6611  6511  0 23:34 pts/1    00:00:00 sleep 3m
myself    6511  2792  0 23:28 pts/1    00:00:00 bash
myself    2792  2496  1 23:02 ?        00:00:24 /usr/lib/gnome-terminal/gnome-terminal-server
myself    2496  2267  0 22:12 ?        00:00:00 /sbin/upstart --user
(...)

Le sleep semble toujours rattaché à bash, lequel est rattaché à gnome-terminal, comme dans le cas précédent.
Fermons ce terminal contenant ce sleep maintenant :

$ ID=$(pidof sleep); if [ -z $ID ]; then echo "No process"; else while :; do ps --pid $ID -f | tail -n1; [ $ID -eq 1 ] && break; ID=$(ps --pid $ID -o ppid | tail -n1); done; fi
myself    6611  2496  0 23:34 ?        00:00:00 sleep 3m
myself    2496  2267  0 22:12 ?        00:00:00 /sbin/upstart --user
(...)

Et voila, le sleep est toujours là, contrairement à la première fois, mais il s'est rattaché au premier "ancêtre" toujours présent, qui se trouve être le programme lancé par lightdm lorsque l'utilisateur courant s'est mis en session.


Alors maintenant, dans les exemples ci-dessus on a mis la sortie vers /dev/null

Pas très pratique pour "suivre ce qu'il se passe".

Tu peux bien sûr rediriger ton rsync vers un fichier, ainsi en retournant en SSH, un coup de ps te dira si ton rsync est toujours là, et un coup de tail sur le fichier de sortie de donnera (à peu près) l'idée d'où ça en est !

"à peu près"... à cause de la bufferisation des outputs. En général tu as un buffer du genre 4096, et donc des blocs de 4096 octets vont être écrits sur le fichier de sortie. Si tu rsync beaucoup de petits fichiers, ce n'est pas gênant, mais avec peu de gros fichiers, tu auras peu de lignes écrites en output, et donc des temps énormes entre 2 écritures sur l'ouput ce qui peut te donner l'impression que c'est planté.

Pour remédier à cela tu peux utiliser stdbuf... pareil... s'il existe sur ton NAS !..

En entier ça donne

nohup stdbuf -oL rsync -a --delete source destination 1>/tmp/rsync_out.txt 2>/tmp/rsync_err.txt 0</dev/null &

Bon courage.


Et comme tu vois, c'est quand même 1000 fois plus simple avec screen, même si on peut toujours faire sans !

Dernière modification par Zakhar (Le 15/09/2017, à 22:58)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#5 Le 16/09/2017, à 08:22

Zakhar

Re : Connaitre l'état d'une commande rsync

Sinon, en une seule commande... et si tu as pstree sur ton NAS

$ pstree -s -p $(pidof sleep)
systemd(1)───lightdm(1793)───lightdm(1945)───upstart(2165)───gnome-terminal-(6710)───bash(6717)───sleep(8514)

"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#6 Le 17/09/2017, à 13:54

Jean-Luc GARNIER

Re : Connaitre l'état d'une commande rsync

Respect total ! smile Explication parfaite, que je vais mettre à l'essai dès que possible (week-end prochain, le rsync promet d'être long !), mais j'ai vraiment appris quelque chose !

Merci infiniment pour ton aide !

Hors ligne

#7 Le 26/09/2017, à 07:23

Jean-Luc GARNIER

Re : Connaitre l'état d'une commande rsync

Bonjour Zakhar,

Je viens de lancer la commande indiquée (NAS en activité, impossible avant), j'ai fermé le terminal, rouvert une nouvelle session et lancé la commande

ps - aux | grep rsync

, qui me retourne:

root      5138  0.0  0.1  24740   376 ?        Ss   Sep08   0:00 /usr/bin/rsync --daemon
root     28452  0.0  0.3   4756   996 pts/3    S+   08:52   0:00 grep --color=auto rsync

Il me semble que cela indique un processus rsync encore actif, mais je n'ai pas l'impression qu'il se passe quoi que ce soit... C'est moi qui n'ai pas confiance dans le système ? ;-)

Merci d'avance pour tes conseils !

Hors ligne