Проверить выполнение скрипта
Вопрос: как лучше проверить, выполняется ли команда в rc.local при загрузке?
Может какие-то if нужны туда еще + в лог отправлять выхлоп.
Подскажите, пожалуйста, кто делал такое и как.
Собственно, у меня там всего лишь синхронизация времени, но на будущее хотелось бы знать, если что:
А разве это будет сильно отличаться в других? 🙂
Никогда не юзал screen, что даст эта команда? Где будет выхлоп или лог?
Вопрос: как лучше проверить, выполняется ли команда в rc.local при загрузке?
Я ща точно не помню какой там в баше знак (кажется &&)
Да там не скрипт, а в rc.local:
Все намного проще. Хотел вот узнать, как мониторить выполнение той или иной команды на предмет ее успешного выполнения.
Bash script — проверка программы на запущенность и ее запуск
В общем, мне нужно было как-то примитивно проверить запущена ли программа, а если нет, то запустить её. Да, есть программы для мониторинга всего этого дела (например, mon), но ставить их из-за одной программы не хотелось, поэтому написал небольшой скрипт.
Для начала смотрим запущена программа или нет:
Писать на Bash несложно, а также весьма увлекательно, в прочем, как и все в программировании. Так что попробуйте сами что-нибудь написать, у вас обязательно получится. Тем более, что по bash полно всякой документации, в том числе и на русском языке.


20 комментариев к записи “ Bash script — проверка программы на запущенность и ее запуск ”
В пояснении к скрипту написано, как исключается из списка процессов сам grep.
Не спорю возможно 🙂 но моя убунта 14.04 упорно считала сама себя 🙂
Что у Вас выводит эта команда?
Походу ничего не выводит, скобки не воспринимает. Это урезанная pxe сборка для загрузки по nfs. А вот на основном серве с полноценной инсталяшкой все работает для интересу проверил.
Если htop не запущен, команда и не должна ничего выводить. Скобки служат для исключения grep из вывода.
Скорее всего, grep у Вас работает как раз верно, не смотря на сборку.
Чё-то как-то сложновато у вас всё. Вот как я сделал бы:
Проверено на труъ убунте в bash и sh.
А ps aux | grep [t]op выдаёт лично у меня нечто со словами org.freedesktop.
Мало ли что там у человека запущено с таким сочетанием букв в путях, именах или параметрах… Вы бы ещё «e» в опции добавили для пущего веселья.
Спасибо за полезный комментарий!
Однако, справедливости ради замечу, что когда ты админишь сервера, то посмотреть вывод ps намного проще и быстрее, чем городить конструкции из if-условий 🙂 В скрипте, согласен, так выглядит элегантнее.
До debian 10.5 работало отлично. На debian 10.5 такая конструкция у меня сломалась, в итоге нагенерировалось максимальное число (4915) процессов cron и все cron-скрипты встали с ошибкой «(CRON) error (can’t fork)» в syslog.
В 10.6 также не работает, поэтому я просто написал юнит для systemd для своего python-скрипта, чтобы автоматом перезапускался, если вдруг упадет.
Как проверить успешность выполнения команды в Bash
Главное меню » Linux » Как проверить успешность выполнения команды в Bash
В этой статье мы продемонстрируем несколько способов проверить, была ли ваша команда в bash успешной. Будут примеры сценариев, которые продемонстрируют его использование. Однако в зависимости от того, какую команду вы запускаете, для проверки может потребоваться разная тактика.
Проверка команды выполнена успешно
Всякий раз, когда команда запускается, возвращаемое значение команды сохраняется в определенной переменной в bash. В первом примере запустим диспетчер пакетов для обновления системы. В нашем случае это Ubuntu, поэтому команда будет примерно такой.
Здесь, по выходным данным, мы можем легко сказать, что команда выполнена успешно. Теперь каждая команда, выполняемая в оболочке bash, возвращает значение, которое хранится в переменной bash «$?». Чтобы получить значение, запустите эту команду.
Если команда выполнена успешно, возвращаемое значение будет 0. Если возвращаемое значение иное, значит, она не выполнилась должным образом. Давайте проверим это. Выполните ту же команду обновления, но на этот раз прервите ее, нажав «Ctrl + C».
Теперь проверьте значение переменной bash.
Сделайте файл исполняемым.
Теперь запустим сценарий.
После выполнения любой команды bash обновит значение переменной. В этом случае после выполнения команды echo мы можем определить, успешно она выполнилась или нет. Замените команду echo чем угодно и вуаля!
Вот еще один интересный метод, который может подтвердить успешность выполнения команды. Это просто однострочная команда, которая очень проста.
Здесь команда разделена на две части символом «||». Если первая команда выполняется успешно, должна выполняться первая команда echo. В противном случае будет запущена вторая команда echo. Давайте проверим это на примере.
Первая часть не удалась, поэтому первая команда echo была пропущена. Вместо этого была запущена вторая команда echo, указывающая на то, что первая часть не была выполнена успешно. Что, если все прошло успешно?
Была активирована первая команда echo.
Вот еще один пример сценария bash.
Если команда не удалась, результат будет другим.
Какой сценарий bash использовать? Мы настоятельно рекомендуем первый, в котором сначала запускается команда, а затем значение «$?» извлекается в переменной, а затем выполняйте все, что хотите, в зависимости от значения переменной.
Последние мысли
Bash – это мощная оболочка с мощной функцией создания сценариев. Если вы хотите узнать, удалось ли выполнить ранее выполненную команду, это одни из самых надежных методов.
Какой метод использовать? Это зависит от того, какой цели вы хотите достичь. Для использования в терминале и в командной строке лучше всего использовать пример одной команды. Что касается сценариев bash, не стесняйтесь, какой метод лучше всего подходит вам, особенно первый пример сценария, который мы продемонстрировали.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Как проверить, если запущенна ли функция?
Но как видно в примере, все работает не так хотелось бы. Догадываюсь, что в условии еще и надо проверить, если countRun() запущен и не запускать его больше, ну или что-то другое о чем я не догадываюсь.
4 ответа 4
Проверить «запущена ли функция» невозможно. Можно проверить, «была ли запущена функция». Для этого функция сама должна себя где-то регистрировать.
По идее да, нужно добавить условие (работает, вроде бы, как нужно):
Это большой комментарий для наглядности
У вас на самом деле не один таймер создается, а целая куча. Добавил в ваш пример вывод номеров таймеров. Причина в том, что onscroll выполняется много раз с в течение прокрутки. Можно, например, складывать номера таймеров в массив и массово зачищать интервал, либо проверять есть ли уже таймер (и делать clearInterval для него) перед созданием нового.
Краткий ответ: нет. Но в этом и нет необходимости из-за спецификации языка.
Лучшее решение данной проблемы на мой взгляд
При инициализации run undefined Затем, когда мы инициализируем интервал, run передается его id.
Сейчас run равно например 28 Соответственно мы можем проверить и тот факт что функция выполнилась и тот факт что сейчас у нас запущен интервал. Например так:
Как использовать коды завершения в Bash-скриптах
Инструменты автоматизации и мониторинга удобны тем, что разработчик может взять готовые скрипты, при необходимости адаптировать и использовать в своём проекте. Можно заметить, что в некоторых скриптах используются коды завершения (exit codes), а в других нет. О коде завершения легко забыть, но это очень полезный инструмент. Особенно важно использовать его в скриптах командной строки.
Что такое коды завершения
В Linux и других Unix-подобных операционных системах программы во время завершения могут передавать значение родительскому процессу. Это значение называется кодом завершения или состоянием завершения. В POSIX по соглашению действует стандарт: программа передаёт 0 при успешном исполнении и 1 или большее число при неудачном исполнении.
Почему это важно? Если смотреть на коды завершения в контексте скриптов для командной строки, ответ очевиден. Любой полезный Bash-скрипт неизбежно будет использоваться в других скриптах или его обернут в однострочник Bash. Это особенно актуально при использовании инструментов автоматизации типа SaltStack или инструментов мониторинга типа Nagios. Эти программы исполняют скрипт и проверяют статус завершения, чтобы определить, было ли исполнение успешным.
Кроме того, даже если вы не определяете коды завершения, они всё равно есть в ваших скриптах. Но без корректного определения кодов выхода можно столкнуться с проблемами: ложными сообщениями об успешном исполнении, которые могут повлиять на работу скрипта.
Что происходит, когда коды завершения не определены
В Linux любой код, запущенный в командной строке, имеет код завершения. Если код завершения не определён, Bash-скрипты используют код выхода последней запущенной команды. Чтобы лучше понять суть, обратите внимание на пример.
Как использовать коды завершения в Bash-скриптах
Проверяем коды завершения
После рефакторинга скрипта получаем такое поведение:
Создаём собственный код завершения
Как использовать коды завершения в командной строке
Скрипт уже умеет сообщать пользователям и программам об успешном или неуспешном выполнении. Теперь его можно использовать с другими инструментами администрирования или однострочниками командной строки.
Скрипт использует коды завершения, чтобы понять, была ли команда успешно выполнена. Если коды завершения используются некорректно, пользователь скрипта может получить неожиданные результаты при неудачном выполнении команды.
Дополнительные коды завершения
Адаптированный перевод статьи Understanding Exit Codes and how to use them in bash scripts by Benjamin Cane. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.










