Linux запустить процесс если он не запущен

Linux запустить процесс если он не запущен

В этом подразделе описывается:

  • как запустить команду в определенное время с помощью команд batch и at;
  • как получить информацию о состоянии процесса;
  • как завершить активный процесс;
  • как вновь запустить остановленный процесс;
  • как пренести процесс из оперативного в фоновый режим и наоборот.

8.4.1. Запуск команд в заданное время

Команды batch и at позволяют вам определять время запуска команды или последовательности команд. При помощи команды batch система определяет время запуска команды, вы это можете определить с помощью команды at. Обе команды ожидают ввод со стандартного ввода (терминала); список команд, вводимых с терминала, должен завершаться нажатием клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).

Команда batch очень полезна, если вы запускаете процесс или программу, которые занимают много системного времени. Команда batch представляет системе задание (содержащее последовательность команд для выполнения). Задание ставится в очередь и запускается как только у системы появляется возможность. Это позволяет системе быстро отвечать на запросы других пользователей. Общий формат команды batch:

Если запускается только одна команда, то ее можно ввести в одной командной строке:

В следующем примере batch используется для выполнения команды grep в согласованное время. Команда grep осуществляет поиск всех файлов в текущем справочнике и перенаправляет вывод в файл dol.file.

После того как вы зададите задание batch, система выдаст ответ, в котором даны номер задания, дата и время. Номер задания не то же самое, что номер процесса, который система генерирует, когда вы запускаете команду в фоновом режиме.

Команда at позволяет вам указывать точное время выполнения команд. Общий фомат команды at:

Аргумент time состоит из времени дня и даты, если дата не сегодняшняя.

В следующем примере показано, как использовать команду at для посылки сообщения happy birthday пользователю с регистрационным именем emily:

Обратите внимание, что команда at подобно команде batch выдает ответ с номером задания, датой и временем.

Если вы не хотите, чтобы команды, находящиеся в данный момент в очереди заданий batch или at были выполнены, то можете удалить их из очереди. Для этого воспользуйтесь опцией -r в команде at, указав ее с номером задания. Общий формат такой команды: Например, чтобы удалить предыдущее задание at, введите: Если вы забыли номер задания, то команда : распечатает вам список текущих заданий в очереди batch или at, как показано на следующем экране:

Таким образом команда at выполняет команды в указанное время. Вы можете использовать от одной до 4-х цифр и буквосочетания «am» и «pm», чтобы указать время. Чтобы указать дату, задайте имя месяца и вслед за ним число. Если задание должно быть выполнено сегодня, то дату вводить не надо.

Читайте также:  Asus k56cb windows 10 drivers

8.4.2. Получить состояние запущенного процесса

Команда ps дает вам состояние всех процессов, запущенных на данный момент. Например, вы можете использовать команду ps, чтобы просмотреть состояние всех процессов, которые запущены в фоновом режиме, применив символ &.

В следующем подпункте обсуждается вопрос, как применить номер PID (идентификатор процесса), чтобы остановить выполнение команды. PID является уникальным номером, который система UNIX назначает каждому активному процессу.

В следующем примере команда grep запускается в фоновом режиме и затем выдается команда ps. Система сообщает в ответ номер идентификации процесса (PID) и номер терминала (TTY). Она также выдает время выполнения каждого процесса (TIME) и имя команды, которая выполняется (COMMAND):

Обратите внимание, что система распечатала номер PID для команды grep так же, как и для всех других запущенных процессов: для самой команды ps и команды sh, которая была запущена во время вашей регистрации.

Вы можете приостановить и вновь запустить программу, если в вашей системе предусмотрена функция управления заданиями. Команда jobs выдает список текущих фоновых процессов, запущенных или приостановленных. Команда jobs дополнительно к PID распечатывает идентификатор задания (JID) и имя задания. Чтобы вновь запустить приостановленное задание, либо возобновить фоновый процесс в оперативном режиме, вам необходимо знать JID. JID распечатывается на экране каждый раз, когда вы вводите команду запуска или останова процесса. Если вы введете: то на экране появится следующая информация: или

8.4.3. Завершение активных процессов

Команда kill завершает активные процессы в фоновом режиме и команда stop приостанавливает временно процессы. Общий формат этих команд: или Обратите внимание, что вы не можете завершать фоновые задания нажатием клавиш BREAK или DEL. Следующий пример показывает, как вы можете завершить команду grep, которая выполняется в фоновом режиме.

После того как система выдаст ответ на запрос, на экране появится подсказка $, означающая, что процесс завершен. Если система не найдет указанный PID, то появится сообщение об ошибке:

Чтобы приостановить оперативный процесс (если активна функция управления заданиями), введите: На экране появится следующее сообщение:

8.4.4. Запуск остановленного задания

Если функция управления заданиями активна, то вы можете вновь запустить приостановленный процесс. Чтобы вновь запустить процесс, остановленный командой stop, вы сначала должны определить JID с помощью команды jobs. Затем вы можете использовать JID со следующими командами: fg — возобновляет приостановленное задание или переводит задание из фонового режима в оперативный; bg — вновь запускает приостановленное задание в фоновом режиме.

8.4.5. Использование команды nohup

Все процессы, за исключением at и batch, завершаются, когда вы выходите из системы. Если вы хотите, чтобы после вашего выхода из системы процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать команду nohup. Команда nohup имеет следующий формат:

Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем справочнике строки «word» и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку:

Вы можете завершить команду nohup с помощью команды kill.

Источник

cron: запустить процесс, но только если он не работает?

Есть ли способ сообщить мне cron запустить приложение, но не запустить его, если процесс уже существует?

5 ответов

Самый простой способ: pgrep

Запустите скрипт, а не непосредственно программу. Есть много возможностей. Например:

Этот сценарий не будет запускаться снова, если предыдущий экземпляр не завершился. Если вы хотите что-то не запускать, если выполняется другой конкретный процесс, см. Сценарий harrymc.

Читайте также:  Boot windows from usb rufus

Вы можете использовать файл блокировки в своем скрипте, но см. Управление процессами .

flock — это одна утилита, которая может быть использована.

Обычно это обрабатывается самой программой, а не cron . Для этого есть два стандартных метода:

1) grep вывод ps , чтобы увидеть, есть ли процесс с уже запущенным именем

2) При запуске сначала проверьте наличие файла pid (process id), обычно в /var/run/program_name.pid , и, если он существует, считывает pid из файла и проверяет, существует ли этот процесс; если это так, откажитесь от запуска. Если файл pid не существует или файл pid исчез, создайте файл pid, напишите в него свой идентификатор процесса и продолжайте с обычным запуском.

В то время как технически возможно писать трубы bash, которые будут делать любой из них непосредственно в вашем crontab, лучше добавить их к запущенной программе (чтобы они применимы независимо от того, как она запускается) или написать сценарий оболочки для обработки этого, как предположил harrymc.

Источник

cron: запустить процесс, но только если он не запущен?

Могу ли я сказать cron запустить приложение, НО не запускать его, если процесс уже существует?

5 ответов 5

самый простой способ, используйте pgrep

Запустите скрипт, а не непосредственно программу. Есть много возможностей. Например :

Этот сценарий не запустится снова, если предыдущий экземпляр еще не завершен. Если вы не хотите запускать что-либо, если запущен другой конкретный процесс, смотрите скрипт harrymc.

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

flock — это одна утилита, которую можно использовать.

Это обычно обрабатывается самой программой, а не cron . Для этого есть два стандартных метода:

1) grep вывод ps чтобы увидеть, запущен ли уже процесс с таким именем

2) При запуске сначала проверьте наличие файла pid (идентификатор процесса), обычно по адресу /var/run/program_name.pid , и, если он существует, прочитайте pid из файла и проверьте, существует ли этот процесс еще ; если это произойдет, откажитесь начать. Если pid-файл не существует или pid в файле исчез, то создайте pid-файл, запишите в него свой идентификатор процесса и продолжите обычный запуск.

Хотя технически возможно написать bash-каналы, которые будут выполнять любой из них непосредственно в вашем crontab, лучше добавить их в запускаемую программу (чтобы они применялись независимо от того, как она запускается) или написать скрипт-обертку для справиться с этим, как предположил Харримк.

Источник

Bash script — проверка программы на запущенность и ее запуск

В общем, мне нужно было как-то примитивно проверить запущена ли программа, а если нет, то запустить её. Да, есть программы для мониторинга всего этого дела (например, mon), но ставить их из-за одной программы не хотелось, поэтому написал небольшой скрипт.

Для начала смотрим запущена программа или нет:

ps aux выводит запущенные процессы.
grep [h]top выводит результаты с htop, при этом если первую букву процесса взять в квадратные скобки, то ‘grep htop’ будет исключаться из списка.
wc -l подсчитывает количество строк (запущенных процессов).
Выглядит это так:

После этого нужно написать условие проверки и запуска программы.
if [ «$ret» -eq 0 ] — если ( if ) значение переменной (ключ -eq означает равно) равно 0, то ( then ):
echo «Running Htop» — выводим текст: «Запускается Htop»;
sleep 1 — ставим задержку при запуске в 1 секунду;
htop — запускаем программу Htop;
exit 1 — выходим из скрипта;
Иначе ( else ):
echo «EXIT. Htop already running!» — выводим текст: «Htop уже запущен!»
exit 1 — выходим из скрипта.
Конструкция «Если. то. иначе. » обязательно заканчивается fi ;

Читайте также:  Общая характеристика операционных систем семейства windows

Писать на Bash несложно, а также весьма увлекательно, в прочем, как и все в программировании. Так что попробуйте сами что-нибудь написать, у вас обязательно получится. Тем более, что по bash полно всякой документации, в том числе и на русском языке.

20 комментариев к записи “ Bash script — проверка программы на запущенность и ее запуск ”

if [ «$ret» -eq 1 ] вот так работает с нулем всегда считает запущенным так как сама команда греп создает процесс и таким именем

В пояснении к скрипту написано, как исключается из списка процессов сам grep.

Не спорю возможно 🙂 но моя убунта 14.04 упорно считала сама себя 🙂

Что у Вас выводит эта команда?

Походу ничего не выводит, скобки не воспринимает. Это урезанная pxe сборка для загрузки по nfs. А вот на основном серве с полноценной инсталяшкой все работает для интересу проверил.

Если htop не запущен, команда и не должна ничего выводить. Скобки служат для исключения grep из вывода.
Скорее всего, grep у Вас работает как раз верно, не смотря на сборку.

Чё-то как-то сложновато у вас всё. Вот как я сделал бы:

Проверено на труъ убунте в bash и sh.

А ps aux | grep [t]op выдаёт лично у меня нечто со словами org.freedesktop.

Это, конечно, top, а не htop… Но зачем такое писать? Какие-то квадратные скобки… То ли выпендрёж, то ли костыли… Тем более с aux зачем-то… Зачем? Почему не -a, не -d, а именно aux? Не понимаю…

Мало ли что там у человека запущено с таким сочетанием букв в путях, именах или параметрах… Вы бы ещё «e» в опции добавили для пущего веселья.

Спасибо за полезный комментарий!
Однако, справедливости ради замечу, что когда ты админишь сервера, то посмотреть вывод ps намного проще и быстрее, чем городить конструкции из if-условий 🙂 В скрипте, согласен, так выглядит элегантнее.

До debian 10.5 работало отлично. На debian 10.5 такая конструкция у меня сломалась, в итоге нагенерировалось максимальное число (4915) процессов cron и все cron-скрипты встали с ошибкой «(CRON) error (can’t fork)» в syslog.

В 10.6 также не работает, поэтому я просто написал юнит для systemd для своего python-скрипта, чтобы автоматом перезапускался, если вдруг упадет.

Источник

запуск процесса при загрузке системы

Куда нужно добавить запись, чтобы запускался определенный процесс при загрузке системы под определенным пользователем? В cron вроде по времени только можно установить или как сделать скрипт который все время проверял запущен или нет данный процес и чтобы он запусклся? redhat 9.0

Re: запуск процесса при загрузке системы

Прочитай любую книжку про линукс, поможет 🙂

Re: Re: запуск процесса при загрузке системы

А ты лучше помалкивай 🙂 Везде комментарии у тебя такого типа, типа почитай доку по qmail, смысл заходить на форум и всем писать это?

Re: Re: Re: запуск процесса при загрузке системы

Почему всем? Мало ты форум читал 🙂 А какой вопрос, такой ответ.

Допустим, я уже несколько раз писал ответ на _этот_ вопрос, еще раз писать лень. Вот и все.

А если чел таки прочитает книжку, ему станет лучше, скажешь нет?

Re: Re: Re: запуск процесса при загрузке системы

>комментарии у тебя такого типа

И в конце-концов, ответ-то правильный! Пусть меня закидают камнями, если это ему не поможет.

Источник

Оцените статью