web-dev-qa-db-fra.com

Comment puis-je courir `regarder` comme un travail d'arrière-plan?

Quand je cours:

watch 'cmd >> output.txt' &

le travail est suspendu par le système:

3569 arrêté (TTY SORTIE)

Y at-il un travail autour?

20
Juliusz

Le but de watch est de montrer les résultats d'une commande en plein écran et de mettre à jour en permanence; Si vous redirigez la sortie dans un fichier et que vous avez une explosion, il n'y a vraiment aucune raison d'utiliser la montre en premier lieu.

Si vous voulez simplement exécuter une commande encore et encore avec un retard (watch _ attend deux secondes par défaut), vous pouvez utiliser quelque chose comme ceci:

while true; do
    cmd >> output.txt
    sleep 2
done
26
Michael Mrozek

Voici un moyen:

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

Depuis que vous avez passé le processus, nous pouvons supposer que vous n'avez pas besoin de l'affichage du terminal et vous redirigez bien dans un fichier. Si vous le faites, vous serez en mesure de faire de l'arrière-plan watch sans problème.

sleep, comme suggéré par Michael Mrozek, sera lentement à la traîne qui peut être indésirable. Outre un script de shell convolué qui surveille le temps système et exécute une commande basée sur le temps écoulé, watch -p peut être une bonne option pour des horaires précis.

Pour des timings précis:

watch -n 1 -p 'date' &>/dev/null &
14
mike dangelo

Je ne suis pas sûr de vos motivations, mais peut-être que cela suffirait-il?

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

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

11
Stéphane Gimenez

Dépend de vos motivations:

  • Vous voulez courir quelque chose périodiquement. Ensuite, vous pourriez 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 si le périphérique est très contraint, et si vous configurez Syslog pour enregistrer moins de messages de Crond, il remplira votre syslog assez rapidement.
  • Vous voulez juste courir quelque chose à plusieurs reprises:

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

    (Vous pouvez exécuter cela à partir du 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 sur une RAMFS (modifier le script avant):

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

      ou même mieux:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
      
    • Vous pouvez combiner screen et watch, afin que vous puissiez toujours vérifier le dernier statut, à condition que cela puisse dans une case.

      screen watch -n 3660 ./make-backup.sh
      

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

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

Vous pouvez utiliser la commande d'écran.

http://www.ycyberciti.biz/tips/linux-screen-command-howto.html

1
Roberto

Si vous devez utiliser watch - Combinez simplement des réponses de Mike Dangelo et L0B

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 passez

tail -f output.txt
0
SDK

Watch est conçu pour sortir à l'écran, mais la sortie peut être redirigée (STDOUT et STDERR), puis il fonctionnera en arrière-plan.

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