Как я могу выполнить 'часы' как фоновое задание?

Я предпочитаю использовать жесткие ссылки.

lockfile=/var/lock/mylock
tmpfile=${lockfile}.$$
echo $$ > $tmpfile
if ln $tmpfile $lockfile 2>&-; then
    echo locked
else
    echo locked by $(<$lockfile)
    rm $tmpfile
    exit
fi
trap "rm ${tmpfile} ${lockfile}" 0 1 2 3 15
# do what you need to

Жесткие ссылки являются атомарными по NFS и по большей части, mkdir также. Используя mkdir(2) или link(2) о том же, на практическом уровне; я просто предпочитаю использовать жесткие ссылки, потому что больше реализаций NFS позволило атомарные жесткие ссылки, чем атомарный mkdir. С современными выпусками NFS Вам не придется взволновать использование также.

19
27.09.2011, 13:47
10 ответов

Цель watch должен показать результаты полного экрана команды и обновления непрерывно; если Вы перенаправляете вывод в файл и фоновую обработку это, там не действительно никакая причина использовать часы во-первых.

Если Вы хотите просто выполнить команду много раз с задержкой (watch ожидает две секунды по умолчанию), можно использовать что-то вроде этого:

while true; do
    cmd >> output.txt
    sleep 2
done
26
27.01.2020, 19:44

Я не уверен в Ваших мотивациях, но возможно это было бы достаточно?

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

Иначе объясните, почему Вам действительно нужно watch.

11
27.01.2020, 19:44

tee Ваш друг. Например, вот то, как Вы могли показать количество файлов в текущем каталоге и добавить его к count.txt каждые 2 секунды:

watch 'find . -maxdepth 1 -printf " " | wc -c | tee --append count.txt'
2
27.01.2020, 19:44

Можно использовать экранную команду.

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

1
27.01.2020, 19:44
  • 1
    с экраном, можно создать фоновый терминальный сеанс, закрыть его и открыться при необходимости в нем. –  Roberto 27.09.2011, 15:13

Вот способ:

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

Так как вы делаете процесс фоновым, можно предположить, что вам не нужен дисплей терминала, и вы прекрасно перенаправляетесь в файл. Если вы это сделаете, то сможете без проблем фоновое отображение посмотреть .

sleep, как предложил Михаэль Мрозек, будет медленно отставать, что может быть нежелательно. Кроме запутанного скрипта оболочки, который отслеживает системное время и выполняет команду, основанную на истекшем времени, watch -p может быть хорошим вариантом для точного отсчета времени.

Для точного отсчета времени:

watch -n 1 -p 'date' &>/dev/null &
14
27.01.2020, 19:44

Зависит от ваших мотивов:

  • Вы хотите периодически что-то запускать. Тогда вы можете использовать напрямую cron. (Если для ваших целей достаточно детализации времени в 1 минуту).

    • Примечание. Если интервал очень короткий или устройство очень ограничено, и если вы не настроите системный журнал для регистрации меньшего количества сообщений от crond, он довольно быстро заполнит ваш системный журнал.
  • Вы хотите просто запустить что-то несколько раз:

     while sleep 2 ; делать
    команда
    сделано >& log.txt
     

    (Вы можете запустить это, например, из crontab, хотя настоятельно рекомендуется использовать скрипт).

  • Вы хотите периодически запускать команду и иметь доступ к результатам ее последнего выполнения.

    • Вы можете записать вывод в ramfs (предварительно изменив скрипт):

       while sleep 2 ; делать
      cmd >& last_execution.log
      Выполнено
       

      или еще лучше:

       пока сплю 2 ; делать
      cmd >& last_execution.log.tmp
      mv last_execution.log.tmp last_execution.log ## атомарно
      Выполнено
       
    • Вы можете комбинировать экран и часы, чтобы всегда можно было проверить последний статус, если он помещается на один экран:

       экран смотреть -n 3660 . /make-backup.sh
       
2
27.01.2020, 19:44

Если вы должны использовать watch-, просто объедините ответы от mike dangelo и l0b0

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

напр.

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

затем наблюдайте, как идут секунды

tail -f output.txt
1
27.01.2020, 19:44

Часы предназначены для вывода на экран, но их вывод может быть перенаправлен (как на стандартный вывод, так и на стандартный вывод ), после чего он будет работать в фоновом режиме.

watch 'date >>fa' >/dev/null 2>/dev/null &
0
27.01.2020, 19:44

значит, это работает

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

например, не очищать экран и возвращать курсор после его завершения -, но это также ставит под сомнение, почему вы используете часы. Команда разработана, чтобы быть визуальной, поэтому вы не можете ее пропустить. Возможно, вам нужно не то, для чего они создали эту команду. Просто откройте второй сеанс терминала (, у вас должно быть два открытых в любом случае, )и запустите либо нужную вам команду watch, либо быстрый цикл cli, чтобы сделать то, что вам нужно, но запуск его как задания bg действительно подталкивает его. (что там за команда )всю дорогу в сторону...

-1
20.03.2020, 17:54

nohup watch 'cmd >> output.txt' &

Это самое простое и работающее решение.

0
22.06.2020, 06:55

Теги

Похожие вопросы