Comment puis-je exécuter `watch` comme tâche de fond?

19

Quand je cours:

watch 'cmd >> output.txt' &

le travail est suspendu par le système:

3569 Arrêté (sortie tty)

Y at-il un travail autour?

Juliusz
la source

Réponses:

26

Le but de watchest d'afficher les résultats d'une commande en plein écran et de les mettre à jour en continu; si vous redirigez la sortie dans un fichier et que vous le mettez en arrière-plan, il n'y a vraiment aucune raison d'utiliser watch en premier lieu.

Si vous souhaitez simplement exécuter une commande encore et encore avec un délai ( watchattend deux secondes par défaut), vous pouvez utiliser quelque chose comme ceci:

while true; do
    cmd >> output.txt
    sleep 2
done
Michael Mrozek
la source
Existe-t-il un moyen de le faire de manière non bloquante? Par exemple, si je veux mettre ceci et d'autres commandes dans un seul script bash, et le faire continuer à exécuter le code qui vient après cela (tout en faisant cela en arrière-plan)?
Austin
14

Voici un moyen:

watch -n 1 'date' &>/dev/null &

Puisque vous planifiez le processus, nous pouvons supposer que vous n'avez pas besoin de l'affichage du terminal et que vous êtes en train de rediriger vers un fichier. Si vous faites cela, vous pourrez faire un historique watchsans problème.

sleep, comme l'a suggéré Michael Mrozek, tardera lentement, ce qui peut être indésirable. Mis à part un script shell alambiqué qui surveille l'heure système et exécute une commande basée sur le temps écoulé, watch -ppeut être une bonne option pour des temporisations précises.

Pour des horaires précis:

watch -n 1 -p 'date' &>/dev/null &
mike dangelo
la source
désolé, comment ça marche? pourquoi est-il possible d'utiliser seulement &deux fois?
phil294
Lisez la section pipeline de man bashpour voir comment fonctionne le premier &. ;)
Mioriin
11

Je ne suis pas sûr de vos motivations, mais ce serait peut-être suffisant?

while true; do sleep 2; cmd >>output.txt; done &

Sinon, veuillez expliquer pourquoi vous en avez vraiment besoin watch.

Stéphane Gimenez
la source
2

teeest votre ami. Par exemple, voici comment vous pouvez afficher le nombre de fichiers dans le répertoire actuel et l'ajouter à count.txt toutes les 2 secondes:

watch 'find . -maxdepth 1 -printf " " | wc -c | tee --append count.txt'
l0b0
la source
2

Dépend de vos motivations:

  • Vous voulez exécuter quelque chose périodiquement. Ensuite, vous pouvez utiliser directement cron. (Si une granularité de temps de 1 minute est suffisante pour vos besoins).

    • Remarque: Si l'intervalle est très court ou que le périphérique est très contraint, et à moins que vous ne configuriez syslog pour enregistrer moins de messages de crond, il remplira votre syslog assez rapidement.
  • Vous voulez simplement exécuter quelque chose à plusieurs reprises:

    while sleep 2 ; do
      cmd
    done >& log.txt

    (Vous pouvez l'exécuter à partir de la crontab par exemple, bien que l'utilisation d'un script soit fortement recommandée).

  • Vous souhaitez exécuter périodiquement une commande et avoir accès à la sortie de sa dernière exécution.

    • Vous pouvez écrire la sortie dans un ramfs (en modifiant le script avant):

      while sleep 2 ; do
        cmd >& last_execution.log
      done 

      ou encore mieux:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
    • Vous pouvez combiner screenet watch, afin que vous puissiez toujours vérifier le dernier état, tant qu'il tient dans un seul écran:

      screen watch -n 3660 ./make-backup.sh
Raúl Salinas-Monteagudo
la source
0

Si vous devez utiliser watch- Combinez simplement les réponses de mike dangelo et l0b0

watch -n 1 'cmd | tee -a output.txt' &>/dev/null &

par exemple

watch -n 1 'date | tee -a output.txt' &>/dev/null &

puis regardez les secondes passer

tail -f output.txt
SDK
la source
0

La montre est conçue pour sortir sur l'écran, mais sa sortie peut être redirigée (à la fois stdout et stderr) puis elle s'exécutera en arrière-plan.

watch 'date >>fa' >/dev/null 2>/dev/null &
X Tian
la source