20

When I run:

watch 'cmd >> output.txt' &

the job gets suspended by the system:

3569 Stopped (tty output)

Is there a workaround?

10 Answers 10

26

The purpose of watch is to show the results of a command full-screen and update continuously; if you're redirecting the output into a file and backgrounding it there's really no reason to use watch in the first place.

If you want to just run a command over and over again with a delay (watch waits two seconds by default), you can use something like this:

while true; do
    cmd >> output.txt
    sleep 2
done
| improve this answer | |
  • Is there a way to do this in a non-blocking fashion though? For example if I want to put this and other commands in a single bash script, and have it continue to run the code that comes after this (while still doing this in the background)? – Austin Apr 5 '19 at 21:18
  • The use case for watch in the background is running multiple things periodically on different schedules. A loop will not easily accomplish this. – kevinc Apr 19 at 0:40
14

Here's a way:

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

Since you background the process, we can assume you don't need the terminal display and you are fine redirecting to a file. If you do that you will be able to background watch without issue.

sleep, as suggested by Michael Mrozek, will slowly lag which can be undesirable. Aside from a convoluted shell script that monitors system time and executes a command based upon elapsed time, watch -p can be a good option for precise timings.

For precise timings:

watch -n 1 -p 'date' &>/dev/null &
| improve this answer | |
  • sorry, how does this work? why is it possible to just use & two times? – phil294 Dec 16 '17 at 18:52
  • Read the pipeline section of man bash to see how the first & works. ;) – Mio Rin Jul 21 '18 at 17:25
11

I'm not sure about your motivations, but maybe this would be enough?

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

Otherwise, please explain why you really need watch.

| improve this answer | |
2

tee is your friend. For example, here's how you could show the number of files in the current directory, and append it to count.txt every 2 seconds:

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

Depends on your motivations:

  • You want to run something periodically. Then you could use directly cron. (If a time granularity of 1 minute is enough for your purposes).

    • Note: If the interval is very short or the device is very constrained, and unless you configure syslog to log less messages from crond, it will fill up your syslog pretty quickly.
  • You want to just run something repeatedly:

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

    (You can run this from the crontab for example, although using a script is highly recommended).

  • You want to run periodically a command and have access to the output of its last execution.

    • You can write the output to a ramfs (modifying the script before):

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

      or even better:

      while sleep 2 ; do
        cmd >& last_execution.log.tmp 
        mv last_execution.log.tmp last_execution.log ## atomically
      done 
      
    • You can combine screen and watch, so that you can always check the latest status, as long as it fits in one screenful:

      screen watch -n 3660 ./make-backup.sh
      
| improve this answer | |
1

You can use screen command.

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

| improve this answer | |
  • with screen you can create a background terminal session, close it and open when you need it. – Roberto Sep 27 '11 at 12:13
0

If you must use watch - Just combine answers from mike dangelo and l0b0

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

e.g.

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

then watch the seconds go by

tail -f output.txt
| improve this answer | |
0

Watch is designed to output to the screen, but it's output can be redirected (both stdout and stderr) then it will run in the background.

watch 'date >>fa' >/dev/null 2>/dev/null &
| improve this answer | |
0

nohup watch 'cmd >> output.txt' &

This is the simplest and most working solution.

| improve this answer | |
-1

so, this works

watch -tg 'grep Hello ./helloWorldOut.txt' >/dev/null

as in not clearing the screen and returning your cursor when it is complete - but it also calls into question why you are using watch. The command is designed to be visual, so you can't miss it. Perhaps your need is not what they created this command for. Just open a second terminal session (you should have two open anyway,) and run either the watch command you need or a quick cli while loop to do what you need, but running it as a bg job is really pushing it (what the command is there for) all the way to the side...

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.