В общем, мне нужно было как-то примитивно проверить запущена ли программа, а если нет, то запустить её. Да, есть программы для мониторинга всего этого дела (например, mon), но ставить их из-за одной программы не хотелось, поэтому написал небольшой скрипт.
#!/bin/bash ret=$(ps aux | grep [h]top | wc -l) if [ «$ret» -eq 0 ] then < echo «Running Htop» #output text sleep 1 #delay htop #command for run program exit 1 >else < echo «EXIT. Htop already running!» exit 1 >fi;
Для начала смотрим запущена программа или нет:
ps aux | grep [h]top | wc -l
ps aux выводит запущенные процессы.
grep [h]top выводит результаты с htop, при этом если первую букву процесса взять в квадратные скобки, то ‘grep htop’ будет исключаться из списка.
wc -l подсчитывает количество строк (запущенных процессов).
Выглядит это так:
После этого нужно написать условие проверки и запуска программы.
if [ «$ret» -eq 0 ] — если ( if ) значение переменной (ключ -eq означает равно) равно 0, то ( then ):
Как посмотреть запущенные приложения открыть диспетчер задач в Windows
echo «Running Htop» — выводим текст: «Запускается Htop»;
sleep 1 — ставим задержку при запуске в 1 секунду;
htop — запускаем программу Htop;
exit 1 — выходим из скрипта;
Иначе ( else ):
echo «EXIT. Htop already running!» — выводим текст: «Htop уже запущен!»
exit 1 — выходим из скрипта.
Конструкция «Если. то. иначе. » обязательно заканчивается fi ;
Писать на Bash несложно, а также весьма увлекательно, в прочем, как и все в программировании. Так что попробуйте сами что-нибудь написать, у вас обязательно получится. Тем более, что по bash полно всякой документации, в том числе и на русском языке.
32 комментария к записи “ Bash script — проверка программы на запущенность и ее запуск ”
if [ «$ret» -eq 1 ] вот так работает с нулем всегда считает запущенным так как сама команда греп создает процесс и таким именем
Источник: neblog.info
Пошаговое руководство. Тестирование проекта (C++)
При запуске программы в режиме отладки можно использовать точки останова, чтобы приостановить выполнение программы для проверки состояния переменных и объектов.
В этом пошаговом руководстве вы проследите за значением переменной в процессе выполнения программы и определите, почему оно отличается от ожидаемого.
Предварительные требования
- Это пошаговое руководство предполагает знание основ языка C++.
- В нем также предполагается, что вы выполнили инструкции из предыдущих руководств, перечисленных в статье Использование интегрированной среды разработки Visual Studio для разработки приложений для настольных систем на языке C++.
Запуск программы в режиме отладки
- Откройте файл Game.cpp для редактирования.
- Выберите следующую строку кода: Cardgame solitaire(1);
- Чтобы задать точку останова на этой строке, в строке меню выберите Отладка>Точка останова или нажмите клавишу F9. Слева от строки появляется красный кружок, указывающий, что точка останова задана. Чтобы удалить точку останова, снова выберите эту команду в меню или нажмите клавишу F9. Если вы используете мышь, для установки или удаления точки останова также можно щелкнуть в левом поле.
- В строке меню выберите Отладка>Начать отладку или нажмите клавишу F5. Так как программа находится в режиме приостановки выполнения, выполнение приостанавливается при достижении строки точки останова. Желтая стрелка слева от строки кода указывает, что эта строка будет выполнена следующей.
- Чтобы проверить значение переменной Cardgame::totalParticipants , наведите указатель на Cardgame и затем переместите его на элемент управления расширения в левой части окна подсказки. Отображается имя переменной totalParticipants и ее значение 12. Откройте контекстное меню переменной Cardgame::totalParticipants и выберите пункт Добавить контрольное значение, чтобы отобразить переменную в окне Контрольные значения 1. Вы также можете выделить переменную и перетащить ее в окно Контрольные значения 1.
- Чтобы перейти к следующей строке кода, выберите в строке меню Отладка>Шаг с обходом или нажмите клавишу F10. Теперь значение Cardgame::totalParticipants в окне Контрольные значения 1 изменится на 13.
- Откройте контекстное меню для оператора return 0; и выберите Выполнить до текущей позиции. Желтая стрелка слева от кода указывает на следующий выполняемый оператор.
- Номер Cardgame::totalParticipants должен уменьшиться, когда завершится Cardgame . На этом этапе значение Cardgame::totalParticipants должно быть равным 0, так как все экземпляры Cardgame уже удалены, но в окне Контрольные значения 1 мы видим для Cardgame::totalparticipants значение 18. Такая разница указывает на наличие в коде ошибки. Эту ошибку можно обнаружить и исправить, выполнив инструкции из следующего пошагового руководства: Пошаговое руководство. Отладка проекта (C++).
- Чтобы остановить программу, в строке меню выберите Отладка>Остановить отладку или нажмите сочетание клавиш Shift+F5.
Источник: learn.microsoft.com
Как посмотреть Запущенные программы и приложения На компьютере
Как проверить, запущен ли процесс через пакетный скрипт
Как проверить, работает ли приложение из пакетного файла (cmd)? Мне не нужно запускать другой экземпляр, если программа уже запущена. (Я не могу изменить приложение, чтобы сделать его единственным экземпляром.) Также приложение может работать как любой пользователь.
Matt Lacey 02 окт. 2008, в 13:37
Поделиться
Возможно дублирование пакетной программы, чтобы проверить, существует ли процесс
phuclv 29 нояб. 2016, в 08:27
дубликат вопроса, заданного пять лет спустя?
Matt Lacey 06 дек. 2016, в 21:34
Cardinal System 01 апр.
2017, в 18:00
phuclv 02 апр. 2017, в 01:32
Cardinal System 02 апр. 2017, в 02:41
phuclv 02 апр. 2017, в 07:53
oopsdazie 18 май 2017, в 13:58
phuclv 18 май 2017, в 14:38
Показать ещё 6 комментариев
Поделиться:
command-line
17 ответов
Еще одна возможность, с которой я столкнулся, с помощью grep:
tasklist /FI «IMAGENAME eq myapp.exe» 2>NUL | find /I /N «myapp.exe»>NUL if «%ERRORLEVEL%»==»0» echo Program is running
Не нужно сохранять дополнительный файл, поэтому я предпочитаю этот метод.
Chaosmaster 25 авг. 2009, в 17:45
Поделиться
это работало для меня хорошо (Windows XP SP3). ИМХО, это самый элегантный способ из всех предложенных здесь, используя только инструменты, поставляемые с окнами
hello_earth 08 июль 2010, в 15:30
У меня была проблема с синтаксисом этой командной строки. Я изменил его на tasklist /FI «IMAGENAME eq winword.exe» 2>NUL | find /I /N «winword.exe»>NUL / if %ERRORLEVEL%==1 goto wordnotrunning к if %ERRORLEVEL%==1 goto wordnotrunning , чтобы заставить его работать (подозревая кавычку вокруг частей if
Steve B 19 окт. 2011, в 07:17
У меня работает на Windows Server 2003! 🙂
Enrico 05 июль 2012, в 13:36
Большое спасибо, человек гений, не могли бы вы предоставить код, если он запущен, то закройте приложение.
Mowgli 15 сен. 2012, в 21:47
Пожалуйста, помните, что в других языковых версиях XP имена фильтров переводились в коде, но не в справке /? экран. Так, например, IMAGENAME в польской версии — NAZWA_OBRAZU .
rsk82 30 нояб. 2012, в 15:44
Под Win7 мне пришлось изменить его на tasklist /FI «IMAGENAME eq myapp.exe» /NH | find /I /N «myapp.exe» >NUL Первый NUL кажется ненужным, я понятия не имею, для чего используется ‘2’, / NH является необязательным.
Jan Doggen 08 нояб. 2013, в 09:17
список задач всегда выходит со статусом 0, независимо от того, находит ли он какие-либо подходящие задачи, поэтому он сам по себе бесполезен. Поскольку вы все равно должны использовать find (или findstr) для проверки его вывода, нет смысла использовать фильтры списка задач. Просто сделай список задач | найти «myprog.exe»> nul: goto foundit или somesuch. Вам может понадобиться параметр / v (подробный) для списка задач.
Denis Howe 07 июнь 2014, в 12:32
На самом деле вызов внешнего find.exe можно избежать. Смотрите мою уменьшенную версию поблизости .
TrueY 21 авг. 2014, в 10:21
akavel 08 янв. 2015, в 09:14
как сказал Ян Догген, у меня не получилось. Ответ ниже Мэтта Лейси работал для меня без изменений.
Fractal 18 фев. 2016, в 17:49
mtyson 29 сен. 2016, в 22:55
Я понятия не имею почему, но мне пришлось использовать if errorlevel 0 , а не if «%ERRORLEVEL%»==»0» . Как ни странно, использование %ERRORLEVEL% работает cmd.exe , если я выполняю команды непосредственно в cmd.exe , но если я пытаюсь сделать то же самое в сценарии .bat , %ERRORLEVEL% всегда оценивается как ноль. FWIW, скрипт использует setlocal enableextensions ; не уверен, связано ли это с наблюдаемым поведением. Это на Windows 7 x64.
Ben Johnson 10 июль 2017, в 15:43
Следует отметить, что если ваше имя задачи слишком длинное, полное имя не будет отображаться в результатах, поэтому вместо этого проверьте противоположное сообщение
drzaus 11 май 2018, в 19:40
Много лишних битов. tasklist | find /i «notepad.exe» > nul более чем достаточно.
Jason 22 март 2019, в 22:57
Показать ещё 12 комментариев
Вот как я это разработал:
tasklist /FI «IMAGENAME eq notepad.exe» /FO CSV > search.log FOR /F %%A IN (search.log) DO IF %%~zA EQU 0 GOTO end start notepad.exe :end del search.log
Вышеуказанное откроет Notepad, если оно еще не запущено.
Изменить: обратите внимание, что это не будет искать приложения, скрытые из списка задач. Это будет включать любые запланированные задачи, выполняемые как разные пользователи, поскольку они автоматически скрыты.
Matt Lacey 02 окт. 2008, в 14:00
Поделиться
Это работает для меня, на XP. Больше ничего не проверял.
Matt Lacey 02 окт.
2008, в 13:53
Изменение формата списка задач на CSV или на что угодно, кроме таблицы, важно, потому что это макет (таблица) списка задач по умолчанию усекает длинные имена изображений, что нарушает логику.
kibbled_bits 22 июнь 2011, в 14:56
Это решение не будет работать в Vista, потому что TASKLIST производит некоторые выходные данные, даже если процесс не найден. Я предполагаю, что то же самое верно для Windows 7.
dbenham 28 янв. 2012, в 16:39
Другие решения работают без временного файла.
Denis Howe 10 март 2018, в 11:22
не работает в Windows 10. search.log содержит «INFO: не выполняются задачи, соответствующие указанным критериям». и блокнот не запускается
Sergey 30 май 2018, в 08:21
Показать ещё 3 комментария
Мне нравится решение Chaosmaster! Но я искал решение, которое не запускает другую внешнюю программу (например, find.exe или findstr.exe). Поэтому я добавил идею из решения Matt Lacey, которая создает также предотвращаемый временный файл. В конце я мог найти довольно простое решение, поэтому я поделился им.
SETLOCAL EnableExtensions set EXE=myprog.exe FOR /F %%x IN (‘tasklist /NH /FI «IMAGENAME eq %EXE%»‘) DO IF %%x == %EXE% goto FOUND echo Not running goto FIN :FOUND echo Running :FIN
Это работает для меня красиво.
TrueY 21 авг. 2014, в 10:32
Поделиться
Это решение хорошо работает — проверено в Windows 8.1. Я заметил, что он чувствителен к регистру.
oliver-clare 02 дек. 2014, в 11:18
TrueY 02 дек. 2014, в 12:42
Хорошо работает для меня — проверено в Windows 7 X64
Mr Rubix 15 март 2016, в 18:21
подтвердить сервер 2008 и windows10 работает нормально
CWilson 25 нояб. 2016, в 13:50
Показать ещё 2 комментария
В Windows вы можете использовать инструментарий управления Windows (WMI), чтобы гарантировать, что приложения с указанной командной строкой не запущены, например:
wmic process where (name=»nmake.exe») get commandline | findstr /i /c:»/f load.mak» /c:»/f build.mak» > NUL (echo THE BUILD HAS BEEN STARTED ALREADY! > %ALREADY_STARTED% если у вас его нет, то Only the administrator group members can use WMIC.EXE. затем Reason:Win32 Error: Access is denied.
Jeroen Wiert Pluimers 14 фев. 2012, в 09:48
я думаю, что это лучшее решение, потому что wmic дает вам полную запущенную командную строку и предоставляет другую информацию .
Glavić 23 май 2012, в 15:42
Предложение npocmaka использовать QPROCESS вместо TASKLIST велико, но его ответ настолько большой и сложный, что я чувствую себя обязанным опубликовать довольно упрощенную версию, которая, я думаю, решит проблему большинства неусовершенствованных пользователей:
QPROCESS «myprocess.exe»>NUL IF %ERRORLEVEL% EQU 0 ECHO «Process running»
Приведенный выше код был протестирован в Windows 7 с пользователем с настройками администратора.
aldemarcalazans 11 май 2017, в 19:49
Поделиться
Я просто использовал эту идею, чтобы дважды остановить автоматизированный процесс, и это сработало как шарм!
Davy C 14 март 2018, в 10:23
Я должен сказать, что в отличие от этой команды, решения для списка задач не только выглядят слишком сложными для такого простого запроса, но они также запускают секунду или около того и используют тонны процессора! Это намного лучше, также работает без прав администратора (Windows Server 2012).
Eugene Marin 21 июнь 2018, в 15:36
Ответ TrueY казался самым изящным решением, однако мне пришлось немного поработать, потому что я не понимал, что именно происходит. Позвольте мне прояснить ситуацию, надеюсь, сэкономить некоторое время для следующего человека.
TrueY modified Отвечено:
В любом случае, я надеюсь, что это поможет. Я знаю, что иногда чтение партии/командной строки иногда бывает путаным, если вы новичок, как я.
kayleeFrye_onDeck 24 сен. 2014, в 19:58
Поделиться
Я использую PV.exe из http://www.teamcti.com/pview/prcview.htm, установленный в Program FilesPV с таким пакетным файлом:
Adam 02 дек. 2008, в 19:49
Поделиться
это работает для меня в Windows 7. 2-я строка — это каталог, в котором находится программа, а не сама программа.
Fabio Cionini 16 апр. 2012, в 21:23
Ответ предоставленный Мэттом Лэйси, работает для Windows XP. Однако в Windows Server 2003 строка
tasklist /FI «IMAGENAME eq notepad.exe» /FO CSV > search.log
INFO: не выполняются задачи, которые соответствуют указанным критериям.
который затем считывается при запуске процесса.
У меня нет кучи опыта работы с пакетными сценариями, поэтому моя мысль заключается в том, чтобы затем искать имя процесса в файле search.log и передавать результаты в другой файл и искать для любого вывода.
tasklist /FI «IMAGENAME eq notepad.exe» /FO CSV > search.log FINDSTR notepad.exe search.log > found.log FOR /F %%A IN (found.log) DO IF %%~zA EQU 0 GOTO end start notepad.exe :end del search.log del found.log
Я надеюсь, что это поможет кому-то другому.
benmod 10 авг. 2011, в 08:46
Поделиться
Это работает для Win 2008. +1 для Нет запущенных задач, которые соответствуют указанным критериям.
Mangesh Pimpalkar 10 дек.
2014, в 01:04
Мне нравятся инструменты WMIC и TASKLIST , но они недоступны в домашних/основных версиях окон. Другим способом является использование команды QPROCESS , доступной почти на всех машинах Windows (для тех, которые имеют терминальные службы — Я думаю, что только выиграть XP без SP2, так что практически каждый компьютер Windows):
QPROCESS команда не так сильна, как TASKLIST и ограничена отображением всего 12 символов имя процесса, но следует учитывать, если TASKLIST недоступно.
Более простое использование, когда оно использует имя, если процесс как аргумент (суффикс .exe является обязательным в этом случае, когда вы передаете исполняемое имя):
Различие между двумя способами использования QPROCESS заключается в том, что QPROCESS * отобразит все процессы, а QPROCESS some.exe будет фильтровать только процессы для текущего пользователя.
Использование WMI объектов через окна script host exe вместо WMIC также является опцией. Он должен также запускаться на всех машинах Windows (исключая те, где WSH выключен, но это редкий случай). Вот файл bat, который перечисляет все процессы через классы WMI и может использоваться вместо QPROCESS в script выше (это гибрид jscript/bat и должен быть сохранен как .bat ):
И модификация, которая будет проверять, запущен ли процесс:
Эти два параметра можно использовать на машинах без TASKLIST .
Конечная техника использует MSHTA . Это будет работать на всех машинах Windows с XP и выше и не зависит от настроек Windows script. вызов MSHTA может немного снизить производительность (опять же нужно сохранить как bat):
Источник: overcoder.net