Linux выполнить команду из файла
Обновлено: 21.11.2024
В Linux, когда мы работаем из командной строки, часто очень удобно иметь возможность выполнять несколько команд в одной строке. Например, если вы хотите загрузить, распаковать и открыть результирующую папку, вы должны выполнить одну командную строку следующим образом:
вместо того, чтобы запускать несколько таких команд по отдельности и по одной команде в строке. Тем не менее, при выполнении этих команд важно, чтобы каждая из них была успешной, чтобы могла продолжиться следующая.
Однако иногда вам может понадобиться запустить несколько команд одновременно по той или иной причине. Цель этой статьи — показать вам, как это сделать с помощью GNU Parallel.
Что такое GNU Parallel
GNU parallel — это программа-оболочка для Linux и других операционных систем Unix, которая позволяет пользователю одновременно выполнять сценарии оболочки. Операции разделены между потоками ЦП компьютера, но также могут быть разделены между несколькими компьютерами. Параллель GNU бесплатна и была написана Оле Танге на Perl.
Установка GNU
GNU Parallel можно установить практически на любой дистрибутив Linux. Я буду использовать Ubuntu для демонстрации. Если вы используете другой дистрибутив, вам придется адаптировать команду установки к вашей платформе.
Поскольку GNU Parallel доступен в стандартном репозитории Ubuntu, процедура установки довольно проста. В терминале выполните команду:
sudo apt установить параллельно
Параллельная установка GNU Linux
Теперь все готово для использования GNU Parallel.
Использование GNU Parallel
Пример 1:
Допустим, у вас есть текстовый файл следующего вида:
Теперь мы хотим сжать каждый из приведенных выше png-файлов с помощью GNU Parallel. Это можно сделать следующим образом:
cat файл.txt | parallel -j 4 gzip -k <> [параллельная команда linux]
Где видно, что все файлы, упомянутые в файле file.txt, были сжаты.
Пример 2:
Другой пример, в котором команда извлекает все файлы logo*.jpg и архивирует их:
find -type f -name logo’*.jpg’ | параллельный gzip — лучший
Вверху вы можете увидеть все файлы logo*.jpg перед выполнением над ними команды gzip с помощью параллельного инструмента GNU. В конце концов, все эти png-файлы были сжаты.
Когда результаты поиска передаются в parallel, каждый результирующий элемент в каждой строке вывода рассматривается как один аргумент командой, которую обрабатывает GNU parallel.
Пример 3:
Если у вас есть много команд, которые вам нужно выполнить одновременно, вы можете вставить их все в файл перед передачей их параллельной работе GNU следующим образом:
Сначала с помощью команды cat или предпочитаемой вами команды создайте текстовый файл, в который вы добавляете по одной команде в каждой строке, например:
gzip image.jpg
convert dog.jpg
dog.jpg
opusenc dogbarking.wav
ffmepg -i myvideo.avi -v:b 12000k myvideo.mp4
/>bzip2 myimages.tar
Затем позвольте GNU Parallel выполнить свою работу с помощью команды:
параллельно – задания 6
Опция –jobs сообщает GNU Parallel о количестве разрешенных для запуска команд. Это запустит все команды, указанные в файле tasks, в Parallel. Если количество существующих заданий превышает разрешенное количество заданий, GNU Parallel будет поддерживать очередь до тех пор, пока все задания не будут выполнены.
GNU Parallel запустит задание и выполнит каждую команду в файле отдельно. Parallel будет продолжать это до тех пор, пока будет разрешено создавать новые рабочие места, не нанося вред системе. Как только некоторые задания будут завершены, Parallel создаст новые, пока не будут обработаны все переданные ему задачи. То, что раньше занимало 5 минут, теперь может занять всего 1 или 2 минуты с помощью Parallel.
Пример 4:
найти имя “*.jpg” | parallel -I% –max-args 1 convert % %.jpg
Здесь у нас есть команда find, которая извлекает все файлы с расширением jpg перед передачей их параллельной команде, которая преобразует каждое изображение в формат png.
-I% — это заполнитель с именем %, который будет действовать как отдельный файл, переданный командой find. Если вы этого не сделаете, вам придется вручную вводить новую команду для каждого результата поиска.
–max-args 1 указывает скорость, с которой GNU Parallel запрашивает новый объект из очереди. Скорость ограничена 1 в приведенном выше примере, поскольку для команды, запускаемой GNU Parallel, требуется только один файл.Например, скорость будет ограничена 3, если команде требуется, например, три файла.
convert % %.jpg необходим для преобразования изображений jpg в png. Эта команда должна выполняться параллельно.
Вывод:
GNU Parallel — это гибкий, простой, но мощный инструмент. Если вы освоите его использование, вы сможете выиграть много времени, особенно при работе над независимыми задачами.
В статье мы представили только простые варианты использования, но будьте уверены, что ее можно использовать в гораздо более сложных сценариях реальной жизни.
Вы можете обратиться к его главной странице, на которой он содержит множество полезных примеров, таких как обработка сценариев Bash или удаленное выполнение через SSH.
Вы также можете посмотреть серию руководств создателя инструмента на YouTube.
Если у вас есть другие полезные примеры использования GNU Parallel, не стесняйтесь упоминать их в разделе комментариев ниже.
Если вам нравится контент, мы будем признательны за вашу поддержку, купив нам кофе. Большое спасибо за ваш визит и поддержку.
Марианна Эланотта
Марианна, выпускница факультета коммуникационных технологий, любит делиться последними технологическими достижениями в различных областях. Она любит программировать на Java OO и Javascript и предпочитает работать в операционных системах с открытым исходным кодом. В свободное время она любит играть в шахматы и компьютерные игры вместе со своими двумя детьми.
Shell – это интерпретатор командной строки, который позволяет пользователю взаимодействовать с системой. Он отвечает за получение входных данных от пользователя и отображение выходных данных.
Сценарии оболочки представляют собой серию команд, написанных в порядке их выполнения. Эти скрипты могут содержать функции, циклы, команды, переменные. Скрипты упрощают пользователям сохранение определенных последовательностей кодов, которые могут использоваться снова и снова. Сценарии оболочки также могут содержать комментарии для повышения удобочитаемости.
Сценарий оболочки необходимо сохранить с расширением .sh.
Чтобы сообщить системе Linux, что файл является сценарием оболочки, файл должен начинаться с конструкции shebang.
После этого скрипт может содержать команды, функции, циклы, условные проверки и т. д.
Хороший сценарий всегда содержит комментарии, которые делают его читабельным.
Создание и запуск базового сценария оболочки
Сценарий оболочки можно создать с помощью vi, команды cat или обычного текстового редактора в графическом интерфейсе.
Давайте создадим базовый сценарий оболочки с помощью vi
Это приведет вас к редактору vi. Добавьте следующие строки:
Этот простой скрипт должен отображать имя текущего пользователя и дату.
Чтобы сохранить и выйти из редактора vi:
- Нажмите клавишу ESC.
- Тип:
- Введите «wq».
- Нажмите Enter.
По умолчанию создатель скрипта не получает разрешения на выполнение файла.
Это даст вам (текущему пользователю) разрешение на выполнение файла.
Чтобы запустить скрипт:
Первая строка вывода соответствует команде whoami, а вторая — команде date.
Еще один способ запуска скрипта:
Для запуска файла таким образом может потребоваться предварительное разрешение пользователя. Запуск с помощью bash не требует разрешения.
Тот же скрипт выполняется с «bash» перед ним, но возникают проблемы с правами доступа при попытке выполнить напрямую. Это происходит потому, что команде bash [имя файла] требуется только разрешение на чтение из файла.
Принимая во внимание, что команда ./[filename] запускает файл как исполняемый файл и, следовательно, требует разрешения на выполнение. На этот вопрос подробно ответили на StackExchange.
Вообще лучше предоставить разрешение на выполнение.
Использование переменных в сценариях оболочки
Сценарии могут включать определяемые пользователем переменные. Фактически, поскольку сценарии становятся объемными, важно иметь четко определенные переменные. Переменные, которые носят самоописательный характер, — еще одно качество хорошего сценария.
Добавьте в скрипт следующие строки:
GREETINGS — это переменная, определенная и позже доступная с помощью ‘$’.
В строке, где переменным присваивается значение, не должно быть пробела.
Давайте запустим скрипт:
Чтение ввода из командной строки
Сценарии оболочки можно сделать интерактивными с возможностью принимать ввод из командной строки. Команду чтения можно использовать для сохранения ввода командной строки в переменной.
Переменная NAME использовалась для приема ввода из командной строки.
При запуске скрипта:
Определение функций
Пользователи могут определять свои собственные функции в сценарии. Эти функции могут принимать несколько аргументов.
В скрипт добавить:
Этот скрипт запросит у пользователя имя каталога. Затем он создаст каталог и перейдет в него.
Заключение
Мы увидели, как можно использовать сценарии для запуска команд в последовательном порядке. Скрипты помогают пользователям уменьшить избыточность и сэкономить время. Сценарии также могут быть общими для разных пользователей.
Сценарии, которые мы видели в этом руководстве, были довольно простыми, сценарии также могут быть разработаны для выполнения сложных задач. Чтобы узнать больше о сценариях, обратитесь сюда.
Одной из сильных сторон Linux как операционной системы является возможность ее настройки и настройки в соответствии с вашими вкусами. Использование командной строки позволяет вам выполнять мощные команды, недоступные для других пользователей ОС, а использование командной строки почти необходимо для получения максимальной отдачи от вашего дистрибутива Linux. Например, иногда вам может понадобиться запускать сценарий или команду при каждом запуске компьютера с Linux. Это можно сделать несколькими способами.
Поместите команду в файл crontab. Файл crontab в Linux — это демон, который выполняет редактируемые пользователем задачи в определенное время и при определенных событиях. Чтобы отредактировать файл, откройте терминал и введите «sudo crontab -e», чтобы открыть файл crontab в текстовом редакторе по умолчанию. В первой доступной строке введите «@reboot xxxx», где «xxxx» — это команда, которую вы хотите запустить. Сохраните файл и выйдите.
Поместите сценарий, содержащий команду, в каталог /etc. Создайте сценарий, такой как «startup.sh», используя ваш любимый текстовый редактор. Сохраните файл в каталоге /etc/init.d/. Измените разрешения сценария (чтобы сделать его исполняемым), набрав «chmod +x /etc/init.d/mystartup.sh».
Отредактируйте сценарий /rc.local с помощью текстового редактора. В системах Fedora этот скрипт находится в /etc/rc.d/rc.local, а в Ubuntu — в /etc/rc.local. После того, как вы добавите команды, которые хотите запустить (убедитесь, что вы делаете это от имени пользователя root), сохраните файл и выйдите. Команды будут запущены после следующего запуска.
Вольфрам Донат – специалист в области информационных технологий и писатель, который в настоящее время получает степень в области разработки компьютерных систем. Он успешно пишет как для онлайновой, так и для офлайновой аудитории, а также подрабатывает профессиональным копирайтером, насколько позволяет учеба. В настоящее время он продает свой первый роман агентам и издателям и усердно работает над вторым.
У меня есть сценарий, в котором я каждый день загружаю CSV-файлы в определенную папку /tmp/data_upload, а старые файлы заменяются новыми.
Мне нужно запустить скрипт Python после загрузки данных. Для этого у меня есть идея создать задание cron и следить за изменениями в файле. Я пытался использовать inotify, но я не очень разбираюсь в домене Unix. Как мне это сделать?
Мне нужно выполнить скрипт test.py после изменения даты файла в папке загрузки, например, /tmp/data_upload.
4 ответа 4
Возможно, вам понадобится incrond (демон inotify cron), который будет отслеживать изменения в файлах, а затем выполнять сценарии.
Incrond может контролировать добавление нового файла, изменение, удаление и многое другое. В этой статье показано, какие события incrond может отслеживать на некоторых примерах.
Например, для вашего случая вы можете создать файл /etc/incron.d/data_upload с содержимым
Хотя теоретически это может дать ответ на вопрос, было бы предпочтительнее включить сюда основные части ответа и предоставить ссылку для справки.
Спасибо за ответ, просто чтобы проверить шаги после установки incrontab, следует выполнить incrontab -e от имени пользователя root, а затем включить эту строку /tmp/data_upload IN_CREATE, IN_MODIFY test.py? чтобы проверить, как только я загружу новый файл, он должен выполнить файл test.py?где я должен разместить файл test.py? мне нужно указать абсолютный путь для этого?
Думаю, будет лучше указать абсолютный путь к вашему скрипту. Вы также можете проверить cron или системный журнал, если скрипт не работает
Можете ли вы также задокументировать, на какой файл вы ссылаетесь в своем блоке кода, люди, которые не знакомы с синтаксисом Incrond (такие как я), могут подумать, что они ссылаются на команду, которую вы должны выполнить в командной строке р>
Вы можете использовать entr для автоматического запуска скрипта при каждом изменении файла, запустив ls /tmp/data_upload | entr -p script.py один раз при запуске.
Мне нравится использовать программное обеспечение, написанное на ржавчине, потому что вы знаете, что оно не было заброшено в 2004 году или где-то в этом роде. Он почти должен быть новым.
Мой общий подход состоит в том, чтобы возиться с классической утилитой поиска Unix. Например, команда
найдет все файлы .csv в /tmp/upload_data, которые были изменены менее одного дня назад, и запустит ваш test.py, если он их найдет. Конечно, если ваш файл test.py находится в каком-то другом каталоге, вам нужно соответствующим образом обновить к нему путь.
Если вы запускаете задание cron чаще, чем один раз в день, вы можете использовать параметр mmin, чтобы указать максимальное время с момента модификации в минутах. Например,
будет искать файлы .csv, которые были изменены менее 60 минут назад. Это полезно, если cron выполняет задание ежечасно.
Два справедливых предупреждения: во-первых, это не будет обнаруживать CSV-файлы, которые вы полностью удалили. Вы можете проверить их отдельно. Во-вторых, у меня не было времени все это проверить. Ожидайте опечатки в моем коде, которые вам придется отлаживать самостоятельно.
Читайте также: