- Linux асинхронное выполнение команд
- 1.2. Синхронное и асинхронное выполнение команд
- 1.3. Конвейер
- 1.4. Метасимволы, генерация имен файлов
- Выполнение команд в терминале асинхронно
- Решение
- Как запустить асинхронно (в фоне) несколько комманд разом?
- Кунг-фу стиля Linux: запуск команд
- Запуск команд из командной оболочки
- Планирование запуска команд в определённое время
- Пакетное выполнение задач
- Итоги
Linux асинхронное выполнение команд
Три направления ввода-вывода являются выделенными — стандартный ввод, стандартный вывод и стандартный протокол. Как правило, команды берут исходные данные из стандартного ввода и помещают результаты в стандартный вывод.
Стандартные ввод, вывод и протокол можно переназначить. Обозначение
служит для переназначения стандартного ввода (дескриптор файла 0),
для стандартного вывода (дескриптор файла 1);
ввод происходит со стандартного ввода, пока не встретится указанная или конец файла,
для стандартного вывода; если файл существует, то выводимая информация добавляется к конец этого файла,
в качестве стандартного ввода об(r)является файл, ассоциированный с дескриптором ; аналогично для стандартного вывода
закрывают соответственно стандартный ввод и вывод.
Если любой из этих конструкций предшествует цифра, то с указанным файлом будет ассоциирован дескриптор, равный указанной цифре, вместо 0 и 1 по умолчанию. Например,
для стандартного протокола используется дескриптор 2, а
ассоциирует дескриптор 2 с файлом, ассоциированным с дескриптором 1.
переназначает стандартный протокол (дескриптор 2) в файл по имени protocol.
Чтобы переназначить стандартный протокол туда же, куда уже назначен стандартный вывод, следует употребить конструкцию
Важен порядок переназначения: shell производит переназначение слева направо по указанному списку. Так,
сначала ассоциирует дескриптор 1 с файлом xxx, а затем дескриптор 2 с 1, т.е. тоже с xxx. А
ассоциирует дескриптор 2 с терминалом, а 1 — с файлом xxx.
Можно переназначить системный ввод на текущий файл:
1.2. Синхронное и асинхронное выполнение команд
Обычно shell ждет завершения выполнения команды. Однако имеется возможность запустить задачу в асинхронном режиме, т.е. без ожидания ее завершения. Для этого после команды (после всех ее аргументов и указаний о переназначении ввода-вывода) надо поставить знак &. При этом по умолчанию стандартный ввод команды назначается на пустой файл /dev/null.
Пример: создать файл primer можно по команде
Еще пример: запустить программу prog в асинхронном режиме, чтобы не надо было дожидаться его завершения, засечь время выполнения, результаты программы направить в файл prog.res, данные о времени выполнения — в файл prog.tim.
1.3. Конвейер
Конвейер — последовательность команд, разделенных знаком |. Если после конвейера стоит ; shell ждет его завершения. Если & — то не ждет. Роль ; может играть конец строки. Смысл конвейера в том, что стандартный вывод одной команды замыкается на стандартный ввод другой. Пример конвейера — подсчитать число об(r)ектных файлов в текущем каталоге.
1.4. Метасимволы, генерация имен файлов
Метасимволы — символы, имеющие специальное значение для интерпретатора :
Однако каждый из этих символов может представлять самого себя, если перед ним стоит \. Все символы, заключенные между кавычками ‘ и ‘, представляют самих себя. Между двойными кавычками («) выполняются подстановки команд (см п. 2.2) и параметров (см. п. 2.3), а символы \, `,» и $ могут экранироваться предшествующим символом \.
После всех подстановок в каждом слове команды ищутся символы *. и [. Если находится хотя бы один из них, то это слово рассматривается как шаблон имен файлов и заменяется именами файлов, удовлетворяющих данному шаблону (в алфавитном порядке). Если ни одно имя файла не удовлетворяет шаблону, то он остается неизменным. Значения указанных символов:
Источник
Выполнение команд в терминале асинхронно
Написание программы для выполнение команд в терминале
Всем привет. Возможно уже такое было на форуме. Время от времени юзаю Ubuntu 16.04. Хотелось бы.
Как остановить выполнение команды в терминале?
бесконечно летит трафик, выполнила команду tcpdump, как остановить??
Удаленное выполнение команд в терминале линукс
Добрый день. Подскажите как можно реализовать удаленное общение с консолью линукса. Нужно чтоб.
Выполнение команды в терминале
Здравствуйте, есть скрипт выполнение команды пинг (например). 3
Решение
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Выполнение текста, введённого в терминале, как команды.
Добрый вечер! Хочу что-то типа этого: def myfunc1(): (нечто) def myfunc2(): (нечто) .
Выполнение программы в терминале с поддержкой ключей с аргументами
Подскажите пожалуйста или дайте ссылку если это уже было на форуме.. как сделать выполнение.
C++ Выполнение команд
Суть задачи вот в чем: программа должна выполнять команды, прописанные в файле или переменной. .
Выполнение консольных команд
Преподаватель дал задание написать программу поиска файлов в папке, перенаправления потока, чтобы.
Источник
Как запустить асинхронно (в фоне) несколько комманд разом?
Короче, я сделал такую фигню
Для каждого элемента списка выполняется полный путь к скрипту (/thedir/scriptN в данном случае). То есть, эти скрипты просто выполняются.
Все работает нормально, но только при синхронных вызовах. Когда мне надо запустить демонов в фоне
Начал проявляться реальный уровень знаний анонiмуса.
А я никогда и не говорил, что знаю баш.
Ну так чо, решение то будет?
Откуда он знает решение, главное — кукарекнуть вовремя, чтобы умным показаться.
А я никогда и не говорил, что знаю баш.
Баш здесь не причем.
Нет, конечно. Учи шелл.
Это решение на POSIX sh.
Сам-то понял, что написал?
Так это ж практика, скоро он найдёт фундаментальные проблемы в «модели вычислений» баша и начнет постить своё обычное. Или наоборот!
nolibs, nosoft, nojobs
Нет, ты не понял. Задача не в том, чтобы запустить 3 команды в фоне, это можно и вручную сделать. Задача в том, чтобы написать скрипт, принимающий призвольное число названий скриптов из директории, поданной первым аргументом, и выполняющий их все. То есть должно быть так:
у меня синхронно выполняются /dir/foo, /dir/bar и /dir/baz
А твое «решение на POSIX sh» — это я и без тебя знаю.
Все необходимое там есть, перделки мне не нужны.
Есть все, кроме возможности запустить тред?
Да, я знаю, что это может быть дорого, но ио и так тормозной. Зато прогрессивный.
Оно даже не дойдёт до твоего скрипта — баш будет думать, что ты хочешь запустить: 1) «with dir foo&» — «with dir foo» в фоне; 2) «bar&» — «bar» в фоне; 3) «baz&» — «baz» в фоне.
Т.ч. экранируй: with dir foo\& bar\& baz\& . И гугли, как на твоём io запустить процесс в фоне (т.е. fork + exec, не дожидаясь завершения).
На баше это будет как-то так:
Нет, это был проверочный скрипт.
Нет, запустить нитку внутри самого io просто. foo @bar это все, причем это выражение вернет фьючер, к которому можно обратится как к обычному объекту. Там не какое то быдляцкое говно, как в жабе, там параллелизм на основе акторов.
Проблема то в том, чтобы не внутри Io запустить, а чтобы Io запустил.
Там не какое то быдляцкое говно, как в жабе,
Но ведь ты не знаешь, как в жаве. А там точно так-же
выражение вернет фьючер, к которому можно обратится как к обычному объекту
Первый раз слышу, что в жабе есть акторы.
Собственно, этого оказалось достаточно, все работает, спасибо.
ЗЫ А все таки это косяк, что баш сует свой нос в аргументы, которые ему не предназначены. Логично было бы, если бы он запускал скрипт и сразу передавал ему управление, а не парсил всю строку.
Да, я знаю, что это может быть дорого
Кстати, тут ты тоже лоханулся
Io uses coroutines (user level cooperative threads), instead of preemptive OS level threads to implement concurrency. This avoids the substantial costs (memory, system calls, locking, caching issues, etc) associated with native threads and allows Io to support a very high level of concurrency with thousands of active threads.
Источник
Кунг-фу стиля Linux: запуск команд
Одна из особенностей Linux- и Unix-подобных операционных систем, возможность мощная, но, в то же время, вызывающая немало путаницы, заключается в том, что в этих системах до одной и той же цели можно добраться разными путями. Возьмём, например, что-то простое, вроде запуска последовательностей команд. Как это сделать? Пожалуй, самый очевидный ответ на этот вопрос заключается в написании shell-скрипта. Это — потрясающе гибкий подход к решению подобной задачи. Но что если нужно всего лишь запустить несколько команд, по возможности ничем не усложняя себе жизнь? Выглядит такая задача весьма простой, но существует множество способов решить её — от простого ввода этих команд в командной строке, до планирования их запуска. За выполняющимися командами, кроме того, можно наблюдать, организовав мониторинг очереди задач так, как он может быть организован на мейнфрейме.
Поговорим о запуске команд в Linux, рассмотрим несколько способов запуска последовательностей команд из bash (и из многих других оболочек Linux). Здесь мы коснёмся таких вопросов, как использование утилит cron и at , поговорим о системе пакетного выполнения команд с использованием очереди (task spooler). Я, как и в большинстве случаев обсуждения возможностей Linux, не могу сказать, что то, о чём я хочу рассказать, хотя бы близко подходит к полному освещению способов запуска команд в Linux. Но я надеюсь, что мой рассказ даст вам некоторые идеи относительно управления выполнением последовательностей команд.
Запуск команд из командной оболочки
Самый простой, хотя, возможно, не самый красивый способ запуска набора команд заключается в использовании обычной командной оболочки. Для этого команды достаточно разделить точкой с запятой:
Этот приём работает в большинстве командных оболочек, которые более или менее похожи на bash. Он хорошо подходит для запуска простого набора команд. Команды просто выполняются последовательно. Но что если надо запустить нечто вроде такой конструкции:
Не запускайте эту последовательность команд в реальной системе!
Нам нужно стереть в папке foo все файлы (но не подпапки — для этого нужен ключ -r ). А что если не удастся выполнить команду cd ? Тогда будут стёрты все файлы в текущей папке. А это — очень плохая идея, которая, к тому же, нарушает правило наименьшего удивления.
Защититься от вышеописанной проблемы можно, воспользовавшись оператором && . Эта последовательность символов, как и в языке C, представляет собой оператор И . Практически все Linux-команды возвращают, успешно отработав, 0, что воспринимается как истинное значение, а все остальные значения, указывающие на ошибки, считаются ложными. Это позволяет программистам возвращать коды ошибок при возникновении в программах каких-то проблем. Вот более удачный вариант вышеописанного примера:
Если директория foo существует — команда cd вернёт 0, который будет воспринят как истинное значение. Это означает, что результат операции И может быть истинным. Поэтому работа продолжается и выполняется команда ls . А вот если команду cd выполнить не удастся — результат будет ложным. Если любое из входных значений функции, реализующей логику оператора И , является ложным, то остальные входные значения роли уже не играют. В результате если хотя бы одна из частей этой конструкции вернёт ложное значение — выполнение всей последовательности команд будет остановлено. Получается, что если директории /foo не существует — команда ls попросту не выполнится.
С использованием && можно строить и более длинные конструкции.
Более длинная конструкция, в которой используется && (тут тоже есть rm, поэтому будьте очень осторожны, пытаясь запустить нечто подобное в реальной системе)
В ситуациях, подобных вышеописанной, может найти применение ещё один оператор — || ( ИЛИ ). Он позволяет завершить работу после того, как хотя бы одна команда вернёт истинное значение, то есть — отработает успешно. Например:
Попробуйте, вместо alw , ввести своё имя пользователя, а потом испытайте эту конструкцию с именем пользователя, которого в вашей системе нет (уверен, у вас нет пользователя alw ). Если grep отработает успешно, то команда echo выполнена не будет.
Если нужно — операторы можно смешивать. Правда, если вам нужно выполнить несколько команд, выполнение которых занимает много времени, то, о чём мы только что говорили, нельзя назвать самым удачным способом запуска таких команд. В подобной ситуации стоит взглянуть на систему пакетного выполнения команд, основанную на очереди задач, речь о которой пойдёт ниже.
Планирование запуска команд в определённое время
Иногда нужно, чтобы последовательность команд запустилась бы спустя некоторое время от текущего момента, или чтобы команды были бы выполнены в заданное время. Классический инструмент, используемый для решения подобных задач — это утилита cron . Во многих дистрибутивах есть стандартные директории, позволяющие запускать команды, например, каждый час или каждую минуту. Но лучше всего планировать запуск команд путём редактирования файла crontab . Обычно сначала создают скрипт, а потом уже делают запись о нём в crontab . Правда, необходимость в создании скрипта для запуска нескольких команд возникает далеко не всегда.
Файл crontab редактируют, пользуясь одноимённой командой ( crontab -e ). Каждая строка этого файла, не являющаяся комментарием, описывает некую команду, которую нужно выполнить. Первая часть такого описания сообщает о том, когда именно нужно выполнить команду. Вторая часть содержит указание на саму команду. Например, вот запись, позволяющая запустить команду обновления duckdns:
В начале строки находится описание времени запуска команды — минуты, час, день месяца, день недели. Конструкция */5 указывает на то, что команду нужно запускать каждые 5 минут. Символы * являются универсальными местозаполнителями, представляющими любой час, день месяца и так далее. Есть множество особых конструкций, которыми можно пользоваться в подобных описаниях. Для того чтобы упростить их составление — можете попробовать этот crontab-редактор. Пример работы с ним показан ниже.
Работа с crontab-редактором
Правда, при использовании cron можно столкнуться с одной проблемой. Она заключается в том, что логика утилиты основана на предположении о том, что компьютер работает в режиме 24/7. Так, если запланировать запуск некоей задачи на ночь, а ночью компьютер будет выключен — задача выполнена не будет. Есть ещё одна утилита, anacron , которая создана в попытке исправить этот недостаток. Она, учитывая некоторые ограничения, похожа на cron , но она «навёрстывает упущенное» в том случае, если на момент запланированного запуска некоей задачи компьютер был выключен.
Иногда нужно выполнить некую команду в заданное время лишь один раз. Сделать это можно с помощью команды at :
В ответ на эту команду будет показано простое приглашение командной строки, с помощью которого можно вводить команды. В данном случае эти команды будут выполнены через 10 минут. Эта команда, конечно, поддерживает и указание абсолютных временных значений. Кроме того, программа вас поймёт, если вы вместо 4PM сообщите ей о «teatime» (серьёзно). Команда atq позволяет просмотреть список запланированных задач. А команда atrm позволяет отменять запуск запланированных команд. Это пригодится в том случае, если по какой-то причине в выполнении запланированной команды больше нет необходимости. Если воспользоваться пакетной формой команды ( batch ), система выполнит команды тогда, когда нагрузка на неё будет не слишком высокой.
Если почитать справку по at , то можно узнать о том, что утилита, по умолчанию, использует очередь a для обычных задач, а очередь b для пакетных задач. Для указания очередей можно использовать буквы из диапазонов a-z и A-Z. От имени очереди зависит приоритет помещённых в неё задач.
Тут мне хотелось бы отметить то, что в большинстве систем все задачи, поставленные в очередь, будут выполняться в оболочке, заданной как оболочка, используемая по умолчанию (вроде /bin/sh ), и это необязательно будет bash. Может понадобиться использовать именно bash, или протестировать команды в оболочке, используемой по умолчанию. Если просто запустить скрипт, в котором, в качестве интерпретатора указан bash (например — #!/usr/bin/bash ), то это будет незаметно.
Пакетное выполнение задач
Хотя утилита at имеет вариант, выглядящий как batch , её нельзя назвать полноценной системой, предназначенной для пакетного выполнения задач. Существует несколько подобных систем для Linux, обладающих различными особенностями. Одна из таких систем называется Task Spooler (в репозиториях Ubuntu — task-spooler ). В некоторых системах соответствующая команда выглядит как ts , но в Debian использование подобного имени команды приводит к конфликту, поэтому там используется команда tsp .
Команду tsp применяют, указывая при её вызове описание той задачи, которую нужно выполнить. Она возвращает номер задачи, который можно использовать при планировании зависимостей между задачами. Всё это похоже на использование утилиты at , но эта система отличается гораздо более мощными возможностями. Взгляните на это:
Первая команда запускает, в виде задачи, утилиту wget (это, на самом деле, задача 0). Выполнение команды tsp позволяет просмотреть список задач, находящихся в очереди (в данном случае это — всего одна задача, которая уже завершена). Опция -i позволяет просмотреть сведения об указанных задачах. Опция -c выводит выходные данные задачи. Опцию -c можно воспринимать как нечто вроде команды cat . Ещё одна опция, -t , похожа на опцию -f команды tail . Выходные данные задачи можно, кроме того, отправить по электронной почте, воспользовавшись опцией -m .
Обычно система пакетного выполнения задач выполняет одновременно лишь одну задачу. Это можно изменить, воспользовавшись опцией -S . Можно сделать так, чтобы некая задача ожидала бы, перед запуском, окончания работы предыдущей задачи. Это делается с помощью опции -d . Запуск задачи можно связать и с окончанием произвольно выбранной задачи — для этого используется опция -w .
Если вы читали справку по tsp , то вы могли обратить внимание на то, что эта команда поддерживает и множество других опций. Перед тем, как воспользоваться этой командой в некоей системе, стоит помнить о том, что она может выглядеть не как tsp , а как ts . Примеры использования этой утилиты можно найти на её сайте.
Итоги
Как и во многих других ситуациях, возникающих при работе в Linux, вышеописанные способы запуска наборов команд можно комбинировать. Например, можно сделать так, чтобы cron поставил бы задачу в очередь. А сама эта задача может представлять собой скрипт, в котором применяются операторы && и || , управляющие внутренней логикой выполнения набора команд. Думаете, что это неоправданно сложно? Может быть. Как я уже говорил, можно просто взять и написать обычный скрипт. Но в Linux есть и много других полезных механизмов для решения самых разных задач.
Как вы обычно запускаете наборы команд в Linux?
Источник