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

15

Как я могу запустить команду после X секунд без сна. Или со сном, но без оболочки, просто дождитесь ответа этой команды?

Я использовал это, но это не сработало

sleep 5 ; ls > a.txt

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

Мартин
источник
Почему не работает без оболочки? Какую ошибку вы получаете? Вы проходите полный путь? Вы знаете, какая часть разбирает ;?
Hennes
таким образом, оболочка будет блокировать 5 секунд, а затем выполнить команду. Оболочка, которая будет остановлена, мне не нужна.
Мартин
Затем вам нужно либо запустить его в фоновом режиме, либо в под-оболочке.
Hennes

Ответы:

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.shв 21:34 и 12 секунд 18 декабря 2014 года. Таким образом, теоретически, вы можете использовать atчто-то для запуска через пять секунд в будущем. Однако, это похоже на использование танка, чтобы ударить муху, и предложение Хеннеса лучше.

terdon
источник
Я продолжал возиться с $(sleep 5; echo foo) &я, я не уверен, почему я думал, что мне нужно $ перед этим, но из-за неправильного синтаксиса я просто опубликовал более длинную (и более понятную) версию. (command_for_in_new_shell) короче, хотя.
Hennes
@Hennes и я откровенно сорвали твою очень хорошую идею (за которую я проголосовал). Все, что я сделал, это переформатировал его, чтобы он был короче, и вся заслуга в фактическом мышлении принадлежит вам :).
Terdon
Есть ли способ использовать atс задержкой в ​​секундах?
Фонд Моника иск
@NicHartley нет. Используйте определенное время (например at 21:43), если это то, что вы хотите, или просто сделайте что-нибудь простое, например, sleep 4 && commandзапустить commandчерез 4 секунды.
Тердон
4

Вы можете обойти это, запустив оболочку или скрипт в фоновом режиме.

Пример:

/ bin / sh -c "sleep 5; echo foo" &
[1] 63791
> Активная оболочка подскажет здесь

Через 5 секунд появляется вывод.
Hennes
источник