bash запуск скрипта в фоне
Запуск bash скрипта в фоновом режиме через Systemd
Понадобилось на днях написать простой bash-скрипт, для постоянного мониторинга каталога на наличие в нем файлов *.pdf, с последующей их конвертацией в формат txt. Скрипт должен был работать в фоновом режиме и автоматически запускаться при перезагрузке.
Для начала нужно убедиться, что ваш дистрибутив работает с Systemd, командой:
/run/systemd/system/ — юниты, созданные в рантайме. Этот каталог приоритетнее каталога с установленными юнитами из пакетов.
/etc/systemd/system/ — юниты, созданные и управляемые системным администратором. Этот каталог приоритетнее каталога юнитов, созданных в рантайме. В этом каталоге мы и будем создавать свой юнит.
Переходим в каталог /etc/systemd/system/ и создаем в нем, либо копируем какой-либо существующий файл, к примеру sshd.service, и в нем пишем:
Подробнее о каждой секции:
Секция [Unit]:
Содержит общую информацию о сервисе, его описание, и то, что он должен стартовать после запущенного демона Syslog.
Секция [Service]
Непосредственная информация о нашем сервисе.
Параметр ExecStart указывает на исполняемый файл нашего сервиса. Нужно указывать абсолютные пути, в случае с bash-скриптом путь до скрипта берем в одинарные кавычки.
Type=forking означает, что запускаемый скрипт будет работать в режиме демона. Если мы хотим, чтобы скрипт выполнился один раз, то указываем Type=simple.
Это работающий файл сервиcа Systemd, с небольшим функционалом. Сохраняем файл, и выполняем команду systemctl daemon-reload, чтобы Systemd узнал о нашем сервисе, и вы могли его запустить командой systemctl start bash.service.
У меня запустить получилось не с первого раза, так как сначала я указал не абсолютный путь в параметре ExecStart секции [Service]. После исправления Systemd все равно ругался на ту же ошибку, помогла перезагрузка.
Для просмотра состояния, старта, остановки, перезагрузки, включения или выключения системных сервисов используется команда systemctl. В более ранних версиях Systemd использовались команды service и chkconfig, они по прежнему включены в систему, в основном для обратной совместимости.
Ниже представлены основные команды systemctl:
Для более подробного знакомства с Systemd рекомендую почитать:
Как запустить процесс в фоне Linux
Как правило, выполнение команд в терминале связано с одним неудобством — прежде чем приступить к вводу следующей команды, следует дождаться выполнения предыдущей. Это происходит, поскольку текущий процесс блокирует доступ к оболочке операционной системы и в таких случаях говорят, что команда выполняется на переднем плане. Что же делать, если нужно запустить несколько команд одновременно? Есть несколько решений. Первое и наиболее очевидное — открыть дополнительное окно терминала. Второе — инициировать выполнение команды в фоновом режиме.
Если какой-либо процесс происходит в фоновом режиме, это значит, что он не предусматривает взаимодействия с пользователем, следовательно, доступ к оболочке остается свободным. Прочитав эту статью, вы узнаете как запустить процесс в фоне Linux и что делать, чтобы их выполнение не прерывалось после закрытия терминала.
Как запустить процесс в фоне Linux
Для выполнения команды в фоновом режиме достаточно добавить в конце символ амперсанда (&):
В выводе терминала будут отображены порядковый номер задачи (в квадратных скобках) и идентификатор процесса:
В фоновом режиме можно одновременно запускать сразу два, три, четыре процесса и даже больше.
Работая в фоновом режиме, команда все равно продолжает выводить сообщения в терминал, из которого была запущена. Для этого она использует потоки stdout и stderr, которые можно закрыть при помощи следующего синтаксиса:
command > /dev/null 2>&1 &
Здесь >/dev/null 2>&1 обозначает, что stdout будет перенаправлен на /dev/null, а stderr — к stdout.
Узнать состояние всех остановленных и выполняемых в фоновом режиме задач в рамках текущей сессии терминала можно при помощи утилиты jobs c использованием опции -l:
Вывод содержит порядковый номер задачи, идентификатор фонового процесса, состояние задачи и название команды, которая запустила задание.
В любое время можно вернуть процесс из фонового режима на передний план. Для этого служит команда fg:
Если в фоновом режиме выполняется несколько программ, следует также указывать номер. Например:
Для завершения фонового процесса применяют команду kill с номером программы:
Как перевести процесс в фоновый режим
Если изначально процесс был запущен обычным способом, его можно перевести в фоновый режим, выполнив следующие действия:
Работа процессов в фоне
Как и в предыдущих случаях, при наличии нескольких одновременно выполняемых процессов следует указывать номер того, относительно которого будет выполнено действие:
Второй способ сохранить запущенные процессы после прекращения работы терминала — команда nohup. Она выполняет другую команду, которая была указана в качестве аргумента, при этом игнорирует все сигналы SIGHUP (те, которые получает процесс при закрытии терминала). Для запуска команды в фоновом режиме нужно написать команду в виде:
Как видно на скриншоте, вывод команды перенаправляется в файл nohup.out. При этом после выхода из системы или закрытия терминала процесс не завершается. Существует ряд программ, которые позволяют запускать несколько интерактивных сессий одновременно. Наиболее популярные из них — Screen и Tmux.
Выводы
Чтобы запустить скрипт в фоне linux, достаточно добавить в конце знак &. При запуске команд в фоновом режиме отпадает необходимость дожидаться завершения одной команды для того, чтобы ввести другую. Если у вас возникли вопросы, обязательно задавайте их в комментариях.
Можно ли запустить выполнение команд bash в фоновом режиме?
Нет ничего более раздражающего, чем запустить команду в своем терминале и заставить ее работать в течение минут, а иногда и часов, и не иметь возможности снова использовать свой терминал. Конечно, вы можете использовать вкладки, но это неуклюжее решение, и оно не всегда оптимально, потому что вы можете хотеть видеть обновления во время работы. Здесь мы покажем вам несколько различных способов запуска команд bash в фоновом режиме в Linux.
Завершите команду с помощью &
Если вы хотите поместить команду в фоновый режим, используйте & (амперсанд) в конце простой способ сделать это. Таким образом, вы можете выполнить команду в фоновом режиме и продолжать использовать свой терминал во время его работы. Однако у этого есть уловка. Использование &не отключает команду от вас; он просто отодвигает его на задний план. Это означает, что пока вы пытаетесь использовать терминал, все, что команда хочет отправить STDOUT или STDERR все еще будет напечатано, что может отвлекать.
Использование & хорошо, если вам нужно немного оттолкнуть что-то, но не ожидайте, что это будет продолжаться вечно.
& После команды, затем отклонить ее
Чтобы использовать этот метод, начните с добавления &.
Как упоминалось выше, использование &этой команды переводит эту команду в фоновый режим, но не отключает ее от пользователя. Вы можете проверить это, набрав jobs в терминале. Он покажет, как команда работает в фоновом режиме, как мы видели раньше.
& После команды с /dev/null
Добавление & после команды переместит команду в фоновый режим, но в результате фоновая команда продолжит выводить сообщения в терминал по мере того, как вы его используете. Если вы хотите предотвратить это, подумайте о перенаправлении команды на /dev/null.
Nohup, с & и /dev/null
В отличие от предыдущих команд, использование nohup позволяет запускать команду в фоновом режиме и продолжать ее выполнение. Как? nohup обходит сигнал HUP (сигнал зависания), что позволяет запускать команды в фоновом режиме, даже когда терминал выключен. Объедините эту команду с перенаправлением на «/dev/null» (чтобы nohup не создавал файл nohup.out), и все перейдет в фон с помощью одной команды.
Большинство терминальных программ в Linux сегодня имеют встроенные функции, позволяющие им работать в фоновом режиме без особых усилий. Наряду с этим современные системы инициализации (например, systemd) могут позволять пользователям запускать такие программы, как службы, при загрузке или в любое время.
Тем не менее, некоторые программы в Linux не могут работать как демон или интегрироваться с современными системами инициализации. Это реальное неудобство, но его можно понять, поскольку не у всех разработчиков есть навыки или время для добавления новых функций.
К счастью, такие команды, как nohup или disown, все еще существуют и могут закрыть пробел в перемещении подобных программ на задний план. Они не идеальны или необычны, но они выполняют свою работу, когда это необходимо.
Запуск команд в фоновом режиме
Как запустить команду в фоновом режиме, чтобы сразу получить доступ к интерфейсу командной строки?
Команда, выполнение которой было запланировано принудительно, называется фоновым процессом. Фоновые процессы не отображаются на экране. Например, HTTPD-сервер Apache работает в фоновом режиме для обслуживания веб-страниц. В фоновый режим можно поместить скрипт оболочки или любую команду.
Синтаксис
Задачу (например, команду или скрипт) можно перевести в фоновый режим, добавив символ «&» в конец командной строки. Этот оператор переводит команду в фоновый режим и освобождает место в терминале. Команда, выполняемая в фоновом режиме, называется заданием. Во время работы фоновой команды можно выполнять любые другие команды. Синтаксис выглядит следующим образом:
Примеры
Чтобы перевести команду ls в фоновый режим, введите:
$ ls *.py > output.txt &
Как найти задания, работающие в фоновом режиме?
Выполните следующую команду:
jobs
Пример вывода данных:
Пример вывода данных:
Пример вывода данных:
Как прекратить выполнение заданий, работающих в фоновом режиме?
Для принудительного или постепенного завершения процесса следует использовать команду kill. Синтаксис выглядит следующим образом:
Как переместить процесс из фонового режима в приоритетный?
Пример вывода данных:
Чтобы перевести задание job id #2 в приоритетный режим, введите: %2 ИЛИ используйте команду: fg 2
Пример вывода данных:
Чтобы перевести это задание обратно в фоновый режим, нажмите клавишу Z, удерживая клавишу CTRL. При этом выполнение текущего приоритетного задания будет приостановлено. Введите следующую команду, чтобы перевести задание в фоновый режим:
%2 &
ИЛИ используйте команду: bg
Теперь командное задание grep будет работать в фоновом режиме.
Краткое описание всех полезных команд
Примечание: n — это id задания (id задания можно узнать, выполнив команду jobs).
P. S. Другие инструкции:
Ознакомиться с другими инструкциями вы можете на нашем сайте. А чтобы попробовать услугу — кликните на кнопку ниже.
Команда запуска bash в фоновом режиме
Главное меню » Linux » Mint » Команда запуска bash в фоновом режиме
Иногда процессам может потребоваться немного больше времени для запуска и завершения своего выполнения. Это когда одно за другим выполнение может стать для пользователя немного сложным. Это может включать отправку или мониторинг вывода в его журналы. Такие процессы могут неожиданно занять больше времени, поскольку компиляция кода не всегда гладкая. Таким образом, тем временем, когда компиляция продолжается, пользователи могут не иметь доступа к системе, пока компиляция не будет завершена. Во время компиляции терминал нельзя использовать, пока он не будет завершен. Чтобы продолжить обычную работу, пока вы обрабатываете команду, пользователям необходимо знать, как запускать команды в фоновом режиме в Linux. Давайте пройдемся по этой статьи, чтобы узнать о нем больше.
Чтобы запустить командный фон в Linux Mint 20, вам необходимо открыть Терминал из Меню в левом нижнем углу экрана, а затем выбрать опцию Терминал из списка доступных приложений.
После открытия терминала вы можете запускать команды в фоновом режиме или отправлять их в фоновый режим в соответствии с требованиями пользователя для бесперебойной работы.
Использование «&» для запуска команды в фоновом режиме:
Пользователи могут выполнять команды для запуска в фоновом режиме, если они добавят символ «&». Это будет означать, что пока команды выполняются, пользователи по-прежнему могут выполнять соответствующую работу вместе с ними без каких-либо перерывов. В качестве примера рассмотрим команду добавления чисел в текстовый файл.
Данные внутри квадратных скобок – это номер задания фонового процесса, а следующий набор цифр – это идентификатор процесса.
Примечание. Как только описанный выше процесс должен быть запущен, снова появляется командная строка, которая позволяет пользователям возобновить свою работу, запустив команды в фоновом режиме в соответствии с требованиями пользователя. Если бы мы выполнили команду, не заканчивая ее символом «&», то не было бы никакого взаимодействия с пользователем, и оно было бы полностью заблокировано, если действие не будет завершено.
Чтобы отправить запущенную команду в фоновом режиме:
Если пользователи уже запустили определенную команду и пока они использовали свою систему, их командная строка блокируется, то они могут приостановить выполнение своего текущего процесса, находящегося на переднем плане, используя «ctrl + z» для Windows и «command + z» для системы Mac. Они переведут свои процессы на фазу временной остановки, а затем это поможет им использовать идентификатор задания, который мы уже видели ранее и были написаны в квадратных скобках.
Теперь процесс переднего плана приостановлен, и, зная идентификатор задания, мы можем установить и настроить фон. Мы можем сделать это, просто набрав это в нашей командной строке:
Теперь процесс снова запущен и работает в фоновом режиме.
Чтобы вывести фоновый процесс на передний план:
Пользователи также могут легко вывести фоновый процесс на передний план, просто указав рядом с ним fg [номер задания].
Теперь, опять же, пользователи могут использовать клавиши ctrl + z, чтобы снова приостановить процесс. Это простой способ сначала вывести процесс на передний план, а затем остановить его.
Чтобы завершить фоновое задание:
Пользователи могут не только запускать и перемещать различные процессы с помощью фоновых команд, но они также могут уничтожать конкретное задание или процесс, используя % перед идентификатором. В приведенном ниже примере показана та же команда. Просто введите kill% 1, потому что в нашем случае мы использовали 1.
В вашем случае вы можете попробовать заменить цифру «1», выделенную жирным шрифтом, на номер вашей работы.
Заключение:
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.