Last issue, we looked at using the ‘&’, ‘&&’ and ‘||’ commands as well as one or two other bash quirks. This time around, I want to explain a bit more as my proofreader gave me the “sure… but OK”routine. When you use the ampersand at the end of a command or shell script, you basically tell it to go play in the park while you continue to type in the terminal. If you don’t, it could hog your terminal. For most of us, this is not a problem, as we all use modern terminal emulators, where we can just open another tab or instance. The issue arises when you are doing something on a remote server via, say ssh, and you have a script hogging the command line, so we use the ampersand at the end to tell it to play in the park (go to the background). That said, we don’t always have to do it one way only. We can take a look at what’s cooking and put it back in the oven, so to speak. We can have multiple ‘jobs’ running in the background and we can switch between them as they run. Using sleep in a script is usually a good way to stretch it out, as I have no long-running scripts at hand. I have been watching a cartoon with an alien and his robot invading earth, so I made a simple script: #!/usr/bin/env bash while true; do echo “ Doom, doom, doom!” sleep 3 done
Dans le dernier numéro, nous avons étudié l'utilisation des commandes « & », « && » et « || » ainsi qu'une ou deux autres particularités de bash. Cette fois-ci, je veux expliquer un peu plus, car mon relecteur m'a donné la routine « bien sûr… mais OK ».
Lorsque vous utilisez l'esperluette à la fin d'une commande ou d'un script shell, vous lui dites en gros d'aller jouer dans le parc pendant que vous continuez à taper dans le terminal. Si vous ne le faites pas, il pourrait monopoliser votre terminal. Pour la plupart d'entre nous, ce n'est pas un problème, car nous utilisons tous des émulateurs de terminaux modernes, où nous pouvons simplement ouvrir un autre onglet ou une autre instance. Le problème survient lorsque vous faites quelque chose sur un serveur distant via, par exemple, ssh, et que vous avez un script qui monopolise la ligne de commande, nous utilisons donc l'esperluette à la fin pour lui dire de jouer dans le parc (aller en arrière-plan).
Cela étant dit, nous ne sommes pas toujours obligés de le faire uniquement d'une seule manière. Nous pouvons jeter un œil à ce qui est en train de cuire et le remettre au four, pour ainsi dire. Nous pouvons avoir plusieurs « tâches » en cours d’exécution en arrière-plan et nous pouvons basculer entre elles au fur et à mesure de leur exécution. Utiliser sleep dans un script est généralement un bon moyen de l’étirer, car je n’ai pas de scripts de longue durée sous la main. Je regarde un dessin animé où un extraterrestre et son robot envahissent la Terre, alors j’ai créé un script simple :
#!/usr/bin/env bash while true; do
echo " Doom, doom, doom!" sleep 3
done
Save it as doom.sh and we can run it with: bash doom.sh and you will notice that you cannot type. You can press CTRL+z to stop it. Unlike pressing CTRL+c, you will see a message, with a job number and what happened. I’ll add a picture, but I urge you to do it yourself: Remember, stopped does not mean it is dead or cancelled. We have the job number; [1], in my case, and I can tell it to go continue, but outside, in the park, with: bg %1 (the syntax is bg %<job number>) and I should get my invader Zim doom warnings again. However, I can type, say, ls -la - and I will get output (even though I have a doom scroller scrolling along). We can call the job back into the house (foreground) from the park (background) with a simple: fg %1 - the challenge here is to remember the job number, should you have lots of jobs running - but we can talk about that later. Go ahead and try it, even if your typing looks wonky, don’t worry as the text you are seeing will not execute, only what you have typed. (You can just use just: %1, but it is good to know the proper way.)
Enregistrez-le sous le nom doom.sh et nous pourrons l'exécuter avec : bash doom.sh ; vous remarquerez que vous ne pouvez pas taper. Vous pouvez appuyer sur CTRL+z pour l'arrêter. Contrairement à appuyer sur CTRL+c, vous verrez un message, avec un numéro de tâche et ce qui s'est passé. J'ajouterai une image, mais je vous invite à le faire vous-même :
N'oubliez pas que l'arrêt ne signifie pas qu'il est mort ou annulé. Nous avons le numéro de tâche ; [1], dans mon cas, et je peux lui dire de continuer, mais à l'extérieur, dans le parc, avec : bg %1 (la syntaxe est bg %<numéro de tâche>) et je devrais à nouveau recevoir mes avertissements doom d'envahisseur Zim. Cependant, je peux taper, par exemple, ls -la - et j'obtiendrai une sortie (même si j'ai un scroller doom qui défile).
Nous pouvons rappeler la tâche dans la maison (premier plan) depuis le parc (arrière-plan) avec un simple : fg %1 - le défi ici est de se souvenir du numéro de la tâche, si vous avez beaucoup de tâches en cours d'exécution, mais nous pourrons en parler plus tard. Allez-y et essayez, même si votre frappe semble bancale, ne vous inquiétez pas car le texte que vous voyez ne s'exécutera pas, seulement ce que vous avez tapé. (Vous pouvez simplement utiliser : %1, mais il est bon de connaître la bonne méthode.)
Obviously in the real world, you will probably zip a large file on a server and scp it back to your machine, like say, a mongodb database. This may be gigabytes in size and take a while, but it will not have constant output like our stupid doomscroller. Here we would probably just use the ampersand at the end of the command and be done with it. There is a caveat here; if there is something needing user input, like in the above case, I would need to put a password in to copy to my machine, or else nothing will happen and you will feel a chop, like I did here: admin@jumphost:~/fcm$ scp mongodb.zip edd@192.168.0.200:/home/ed/fcm & [1] 5776 Only once you bring it to the foreground, you are asked for the password for the other machine (in my case), and only then will the copying commence and you can type bg to put it back into the background. So don’t immediately put everything to the background because you can.
Évidemment, dans le monde réel, vous compresserez probablement un gros fichier sur un serveur et le renverrez sur votre machine, comme par exemple une base de données MongoDB. Cela peut représenter des gigaoctets et prendre un certain temps, mais cela n'aura pas de sortie constante comme notre stupide doomscroller. Ici, nous utiliserions probablement simplement l'esperluette à la fin de la commande et basta.
Il y a une mise en garde ici : si quelque chose nécessite une saisie de l'utilisateur, comme dans le cas ci-dessus, je devrais mettre un mot de passe pour le copier sur ma machine, sinon rien ne se passera et vous ressentirez une coupure, comme je l'ai fait ici :
admin@jumphost:~/fcm$ scp mongodb.zip edd@192.168.0.200:/home/ed/fcm &
[1] 5776
Ce n'est qu'une fois que vous l'avez mis au premier plan que l'on vous demande le mot de passe de l'autre machine (dans mon cas), et c'est seulement à ce moment-là que la copie commencera et que vous pourrez taper bg pour la remettre en arrière-plan. Ne mettez donc pas immédiatement tout en arrière-plan, car vous le pouvez.
If you forget the job number, especially if you have multiple jobs running, you can use the ‘jobs’ command to check them out. This is why I always say that you should name your scripts properly, not just z.sh and x.sh and so forth (I still name mine like ‘a.sh’ if I was going to use it temporarily, but it is a bad habit and you shouldn’t do it). When you run the jobs command, you will see the running jobs, as well as the stopped jobs (the ones you pressed CTRL+z on). When you get the running jobs printed to the screen, you may see a ‘+’ and a ‘-’ after the job number. The plus indicates the last job you fiddled with, be it running or stopped, and the minus means the one just before that. Not the previous job mind you, but the previous one you fiddled with, be that running it, or stopping it, or bringing it forward, or sending it backward. The reason this is handy, is that you don’t need to type: bg %3 or fg %3, if it has the plus next to the three, [3]+, as you can then just type bg or fg and it will act on the one with the plus. Your homework is to make 4 scripts. They don’t need output, they just need to sleep. Then run them and randomly stop 2, with CTRL+z. Now manipulate them (you can do two at a time with bg %1 %2), but type “jobs” after each time, so you can see the plus and minus move. Easy peasy, lemon squeezy. What do you think? If I made mistakes, please send them to: misc@fullcirclemagazine.org
Si vous oubliez le numéro d'une tâche, surtout si vous avez plusieurs tâches en cours d’exécution, vous pouvez utiliser la commande « jobs » pour les vérifier. C’est pourquoi je dis toujours que vous devez nommer correctement vos scripts, pas seulement z.sh et x.sh et ainsi de suite (je nomme toujours le mien comme « a.sh » si je devais l’utiliser temporairement, mais c’est une mauvaise habitude et vous ne devriez pas le faire). Lorsque vous exécutez la commande jobs, vous verrez les tâches en cours d’exécution, ainsi que les tâches arrêtées (celles sur lesquelles vous avez appuyé sur CTRL+z). Lorsque vous obtenez les tâches en cours d’exécution imprimées à l’écran, vous pouvez voir un « + » et un « - » après le numéro de tâche. Le plus indique la dernière tâche que vous avez manipulée, qu’elle soit en cours d’exécution ou arrêtée, et le moins signifie celle juste avant. Pas la tâche précédente, remarquez, mais celle que vous avez précédemment manipulée, que ce soit en l’exécutant, en l’arrêtant, en l’avançant ou en la renvoyant en arrière. La raison pour laquelle c'est pratique, c'est que vous n'avez pas besoin de taper : bg %3 ou fg %3, s'il y a le plus à côté des trois, [3]+, car vous pouvez alors simplement taper bg ou fg et il agira sur celui avec le plus.
Votre devoir consiste à créer 4 scripts. Ils n'ont pas besoin de sortie, ils ont juste besoin de dormir. Ensuite, exécutez-les et arrêtez-en 2 au hasard, avec CTRL+z. Maintenant, manipulez-les (vous pouvez en faire deux à la fois avec bg %1 %2), mais tapez « jobs » après chaque fois, afin de pouvoir voir le plus et le moins se déplacer. Facile comme bonjour. Qu'en pensez-vous ?
Si j'ai fait des erreurs, veuillez les envoyer à : misc@fullcirclemagazine.org