Виконати команду через секунди (без сну)


15

Як я можу виконати команду через X секунд без сну. Або зі сном, але без оболонки просто чекати відповіді цієї команди?

Я використовував це, але це не спрацювало

sleep 5 ; ls > a.txt

Мені потрібно запустити його у фоновому режимі. Я намагаюся не запускати його за сценарієм, я намагаюся запустити lsчерез 5 секунд, а оболонка не просто чекає закінчення сну


Чому без оболонки не виходить? Яку помилку ви отримаєте? Ви проходите це повним шляхом? Чи знаєте ви, яка частина розбирає ;?
Геннес

таким чином оболонка буде блокувати 5 секунд, а потім виконати команду., оболонка для затримки мені цього не потрібна.
Мартін

Тоді вам або потрібно запустити його в сценарії у фоновому режимі, або в підколонці.
Геннес

Відповіді:


34

Більш стислий спосіб написання запропонованого Хеннесом

(sleep 5; echo foo) & 

Крім того, якщо вам потрібно більше декількох секунд, ви можете використовувати at. Існує три способи надати команду at:

  1. Труба:

    $ echo "ls > a.txt" | at now + 1 min
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  2. Збережіть команду, яку потрібно запустити, у текстовому файлі, а потім передайте цей файл at:

    $ echo "ls > a.txt" > cmd.txt
    $ at now + 1 min < cmd.txt
    warning: commands will be executed using /bin/sh
    job 3 at Thu Apr  4 20:16:00 2013
    
  3. Ви також можете передавати atкоманди з STDIN:

    $ at now + 1 min
    warning: commands will be executed using /bin/sh
    at> ls
    

    Потім натисніть, CtrlDщоб вийти з atоболонки. lsКоманда буде працювати в протягом однієї хвилини.

Ви можете дати дуже точний час у форматі [[CC]YY]MMDDhhmm[.ss], як у

$ at -t 201412182134.12 < script.sh

Цей сценарій запуститься script.sh18 грудня 2014 року о 21:34 та 12 секунд. Таким чином, теоретично, ви можете використати atдля запуску щось п'ять секунд. Однак це якось, як використовувати танк, щоб переплисти муху, і пропозиція Геннеса краще.


Я продовжував возитися з $(sleep 5; echo foo) &не впевненим, чому я вважав, що мені потрібен долар перед цим, але з моїм синтаксисом неправильно я просто розмістив довшу (і більш зрозумілу) версію. (command_for_in_new_shell), однак коротше.
Геннес

@Hennes і я відверто зірвав вашу дуже гарну ідею (яку я прихилив). Все, що я зробив, було переформатувати, щоб бути коротшим, вся заслуга за фактичні роздуми - це ваше :).
тердон

Чи є якийсь спосіб використання atіз запізненням на секунди?
Фонд позову Моніки

@NicHartley ні. Використовуйте певний час (наприклад at 21:43), якщо це саме ви хочете, або просто зробіть щось просте, як sleep 4 && commandзапустити commandчерез 4 секунди.
тердон

4

Ви можете обійти його, запустивши оболонку або сценарій у фоновому режимі.

Приклад:

/ bin / sh -c "сон 5; відлуння" &
[1] 63791
> Активний підказки тут

foo через 5 секунд з'являється вихід.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.