Разное

Консольные приложения: НОУ ИНТУИТ | Лекция | Консольные приложения и параметры программы

Содержание

Как создавать и публиковать консольные приложения на Python | by Olga Sayfudinova | NOP::Nuances of Programming

Подробное руководство по созданию и публикации консольных приложений на Python

Консольные приложения — это те, которые вы запускаете в терминале. Скорее всего, вы уже пытались их создать. Или, по крайней мере, думали об их создании.

Но создание консольного приложения — это одно, а публикация его в репозиторий с открытым кодом (например, PyPI) — совсем другое. Хотя ни первое, ни второе не является чем-то запредельно трудным.

В этой статье я подробно расскажу, как можно создать простой CLI на Python и опубликовать его в PyPI.

Не так давно я занялся изучением уязвимостей open-source кода и понял, что хочу иметь в арсенале инструмент командной строки, который мог бы находить уязвимости напрямую из терминала. Уязвимости open-source кода обычно публикуются в открытых базах данных. Их можно найти на таких сайтах, как CVE, NVD, WhiteSource Vuln и т. д.

В этой статье мы создадим примитивный скрейпер для поиска и просмотра уязвимостей с сайта CVE, обернем его в простое консольное приложение и опубликуем на PyPI.

Для начала нужно настроить среду разработки и установить необходимые модули. Я предлагаю установить виртуальную среду. Это простое решение, которое позволит избежать конфликтов между версиями модулей.

Для создания виртуальной среды можно воспользоваться командой python -m venv <path/name> (для Python 3) либо установить virtualenvwrapper с помощью pip install virtualenvwrapper и создать виртуальную среду virtualenv через mkvirtualenv -p /path/topython <path/name>.

После того, как виртуальная среда настроена и активирована, вы можете создать папку проекта и установить необходимые модули:

mkvirtualenv -p /usr/bin/python cvecli-env
mkdir cvecli && cd cvecli
mkdir cver && touch setup.py && touch README. md && touch cver/__init__.py && touch .gitignore
pip install requests beautifulsoup4 lxml twine click
pip freeze > requirements.txt

Как только все успешно запустилось, откройте свой проект в любом редакторе кода. Вы увидите похожую структуру:

Для того, чтобы искать и просматривать уязвимости на сайте CVE, потребуется веб-скрейпер. Он поможет нам собирать информацию об уязвимостях. Мы создаем скрейпер в Requests и BeautifulSoup. Вот что будет делать наш скрейпер:

1. искать уязвимости;

2. получать информацию об уязвимости по ее названию на CVE.

Теперь откроем папку cver и создадим в ней файл под названием cve_scraper. Затем пропишем его базовые настройки:

import requests
from bs4 from BeautifulSoupSEARCH_URL = "https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword="CVE_URL = "https://cve.mitre.org/cgi-bin/cvename.cgi?name="def get_html(url):
request = requests.get(url)
if request.status_code == 200:
return request. content
else:
raise Exception("Bad request")def search(s):
passdef lookup_cve(name):
pass

Поиск уязвимостей

Для поиска уязвимостей на CVE используется URL в следующем формате: https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=<ключевое_слово>. Такой формат позволяет извлекать список уязвимостей, соответствующих ключевому слову.

Например, через URL можно получить список всех уязвимостей, связанных с Python:

Для извлечения данных открываем инструменты разработчика (Developer Console) и исследуем DOM-элемент с нужным представлением. Для этого кликните правой кнопкой по любому месту на странице и выберите “исследовать элемент” (inspect element) либо нажмите Ctrl + F12.

Если вы присмотритесь к DOM-структуре выше, то увидите, что результаты представлены в виде таблицы, а каждое значение указано в отдельной строке под таблицей. Такие данные можно запросто извлечь:

def search(s):    

url = f"{SEARCH_URL}{s}"
results=[]
html = get_html(url)
soup = BeautifulSoup(html, "lxml")
result_rows = soup. select("#TableWithRules table tr") for row in result_rows:
_row = {}
name = row.select_one("td a")
description = row.select_one("td:nth-child(2)") if all([name, description]): _row["name"] = name.text
_row["url"] = name.get("href")
_row["description"] = description.text results.append(_row)

return results

В коде выше мы:

1. отправляем запрос в SEARCH_URL с помощью Requests и получаем DOM-содержимое;

2. преобразуем DOM-содержимое в объекты BeautifulSoup. Это позволит нам выделять DOM-элементы с помощью CSS-селекторов, XPATH и других методов;

3. выделяем все tr под таблицей #TableWithRules. Выделяем первый столбец строки в качестве названия, а в качестве описания берем второй. Затем извлекаем текст.

Просмотр информации об уязвимостях

Чтобы просмотреть информацию об уязвимости, нужно взять ее CVE-ID и передать по этому адресу: https://cve. mitre.org/cgi-bin/cvename.cgi?name=CVE-ID.

Откройте инструменты разработчика и исследуйте DOM-структуру.

Такая структура чуть сложнее, поскольку в строках таблицы отсутствует ID или название класса. Поэтому нам нужно пройтись циклом по каждой строке и проверить, не является ли она подзаголовком. Если да, то следующий элемент берется в качестве содержимого-потомка. Каждый подзаголовок отображается в th, а его содержимое — в td.

def lookup_cve(name):
url = f"{CVE_URL}{name}"
html = get_html(url)
soup = BeautifulSoup(html, "lxml")
result_rows = soup.select("#GeneratedTable table tr")subtitle = ""
description = ""raw_results = {}for row in result_rows:
head = row.select_one("th")
if head:
subtitle = head.text
else:
body = row.select_one("td")
description = body.text.strip().strip("\n")
raw_results[subtitle.lower()] = description

return raw_results

Готово! Мы успешно создали веб-скрейпер с CVE. Теперь добавим в него две функции (search и lookup_sve), которые будут искать уязвимости и получать информацию по ним через CVE-ID.

import requests
from bs4 import BeautifulSoup

SEARCH_URL = "https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword="
CVE_URL = "https://cve.mitre.org/cgi-bin/cvename.cgi?name="

def get_html(url):
request = requests.get(url)
if request.status_code == 200:
return request.content
else:
raise Exception("Bad request")

def search(s):
url = f"{SEARCH_URL}{s}"
results=[]
html = get_html(url)
soup = BeautifulSoup(html, "lxml")
result_rows = soup.select("#TableWithRules table tr")

for row in result_rows:
_row = {}
name = row.select_one("td a")
description = row.select_one("td:nth-child(2)")
if all([name, description]):

_row["name"] = name.text
_row["url"] = name.get("href")
_row["description"] = description.text

results. append(_row)

return results

def lookup_cve(name):
url = f"{CVE_URL}{name}"
html = get_html(url)
soup = BeautifulSoup(html, "lxml")
result_rows = soup.select("#GeneratedTable table tr")

subtitle = ""
description = ""

raw_results = {}

for row in result_rows:
head = row.select_one("th")
if head:
subtitle = head.text
else:
body = row.select_one("td")
description = body.text.strip().strip("\n")
raw_results[subtitle.lower()] = description

return raw_results

Наш следующий шаг — структурирование и создание консольного приложения через библиотеку Click.

Click — это Python-пакет для создания красивых интерфейсов командной строки с минимальным количеством кода и возможностью компоновки. Это один из лучших Python-пакетов для создания CLI, и с ним очень удобно работать.

Click позволяет создавать интерфейсы командной строки любого уровня — от самых простых до навороченных (например, Heroku).

В нашем CLI мы реализуем две команды:

1. поиск уязвимости;

2. просмотр уязвимости.

В папке cver создаем файл под названием __main__.py и прописываем его базовые настройки:

import sys
import [email protected]()
@click.version_option("1.0.0")
def main():
"""A CVE Search and Lookup CLI"""
print("Hye")
[email protected]()
@click.argument('keyword', required=False)
def search(**kwargs):
"""Search through CVE Database for vulnerabilities"""
click.echo(kwargs)
[email protected]()
@click.argument('name', required=False)
def look_up(**kwargs):
"""Get vulnerability details using its CVE-ID on CVE Database"""
click.echo(kwargs)
passif __name__ == '__main__':
args = sys.argv
if "--help" in args or len(args) == 1:
print("CVE")
main()

Поиск уязвимостей

Здесь мы будем импортировать функцию поиска search из веб-скрейпера и передавать ей аргумент keyword из командной строки. Таким образом, приложение будет искать уязвимости, совпадающие с ключевым словом:

from scraper import search as cve_search, [email protected]()
@click.argument('keyword', required=False)
def search(**kwargs):
"""Search through CVE Database for vulnerabilities"""
results = cve_search(kwargs.get("keyword"))
for res in results:
click.echo(f'{res["name"]} - {res["url"]} \n{res["description"]}')

Для запуска этой команды:

python cver/__main__.py search python

Просмотр уязвимости

Принцип тот же: используем lookup_cve из веб-скрейпера и передаем туда аргумент name из команды look_up.

@main.command()
@click.argument('name', required=False)
def look_up(**kwargs):
"""Get vulnerability details using its CVE-ID on CVE Database"""
details = lookup_cve(kwargs.get("name"))
click.echo(f'CVE-ID \n\n{details["cve-id"]}\n')
click.echo(f'Description \n\n{details["description"]}\n')
click. echo(f'References \n\n{details["references"]}\n')
click.echo(f'Assigning CNA \n\n{details["assigning cna"]}\n')
click.echo(f'Date Entry \n\n{details["date entry created"]}')

Для запуска этой команды:

python cver/__main__.py look-up CVE-2013–4238

Готово! Мы успешно создали инструмент командной строки по поиску с CVE.

После того, как мы создали консольное приложение и убедились в его работоспособности, можно опубликовать его на PyPI в публичном доступе.

PyPI — это хранилище приложений для пакетов Python. Там можно найти практически все пакеты, которые устанавливаются через pip. Для публикации пакета потребуется аккаунт на PyPI. Если он у вас уже есть, то смело читайте дальше.

Настройка пакета

Следующий шаг — это настройка Python-пакета с помощью setup.py. Если вы хотите, чтобы ваш пакет попал на PyPI, то нужно снабдить его базовым описанием. Эта информация указывается в файле setup.py.

Откройте setup.py в основной директории проекта и поместите в начало файла следующий код:

from setuptools import setup, find_packages
from io import open
from os import pathimport pathlib
# Директория, в которой содержится этот файл
HERE = pathlib.Path(__file__).parent# Текст README-файла
README = (HERE / "README.md").read_text()# Автоматически собирает в requirements.txt все модули для install_requires, а также настраивает ссылки на зависимости
with open(path.join(HERE, 'requirements.txt'), encoding='utf-8') as f:
all_reqs = f.read().split('\n')install_requires = [x.strip() for x in all_reqs if ('git+' not in x) and (
not x.startswith('#')) and (not x.startswith('-'))]
dependency_links = [x.strip().replace('git+', '') for x in all_reqs \
if 'git+' not in x]

В примере выше мы преобразовали содержимое файла README.md в одну строку для дальнейшего использования. Кроме того, мы перечислили все необходимые модули из requirements. txt и сгенерировали ссылки на их зависимости.

Ваш файл requirements.txt выглядит примерно так:

click
requests
beautifulsoup4
lxml
twine

Теперь давайте рассмотрим параметры настроек:

setup (
name = 'cver',
description = 'A simple commandline app for searching and looking up opensource vulnerabilities',
version = '1.0.0',
packages = find_packages(), # list of all packages
install_requires = install_requires,
python_requires='>=2.7', # any python greater than 2.7
entry_points='''
[console_scripts]
cver=cver.__main__:main
''',
author="Oyetoke Toby",
keyword="cve, vuln, vulnerabilities, security, nvd",
long_description=README,
long_description_content_type="text/markdown",
license='MIT',
url='https://github.com/CITGuru/cver', download_url='https://github.com/CITGuru/cver/archive/1.0.0.tar.gz',
dependency_links=dependency_links,
author_email='oyetoketoby80@gmail. com',
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.7",
]
)

В коде выше мы добавили множество строк. Но подробнее обсудим только те из них, которые нужны для установки.

1. name — название пакета, которое появится на PyPI;

2. version — текущая версия пакета;

3. packages — пакеты и подпакеты с исходным кодом. В ходе установки мы пользуемся модулем find_packages. Он автоматически находит все подпакеты;

4. install_requires — используется для перечисления всех зависимостей или сторонних библиотек пакета. В cver мы пользуемся Requests, Beautifulsoup 4 и Click. Их нужно включить в требования к установке install_requires. Нам не нужно добавлять эту информацию вручную, поскольку она присутствует в requirements.txt;

5. entry_points — используется для создания скриптов, которые вызывают функцию внутри пакета. В данном случае мы создаем новый скрипт cver, который вызывает main() внутри файла cver/__main__.py. Наш основной элемент — это __main__.py, который вызывает функцию main() для запуска Click.

До того, как опубликовать пакет на PyPI или выложить в открытый доступ, необходимо снабдить его документацией. То, как будет выглядеть документация, целиком и полностью зависит от самого проекта. Это может быть как простой файл README.md, так и Readme.rst.

Пример хорошо оформленного README.md:

# CVERA simple commandline app for searching and looking up opensource vulnerabilities# Установка## Через Pip```bash
$ pip install cver
```## Вручную```bash
$ git clone https://github.com/citguru/cevr
$ cd cver
$ python setup.py install
```# Использование```bash
$ cver
```## Поиск
`search <keyword>````bash
$ cver search python
```
## Просмотр`search <name>````bash
$ cver look-up CVE-2020-2121
```

Кроме того, не забудьте создать файл . gitignore:

# Байтовая компиляция / оптимизация / DLL-файлы
__pycache__/
*.py[cod]
*$py.class

# C-расширения
*.so

# Сборка дистрибутива / пакета
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
# Обычно такие файлы пишутся Python-скриптом по шаблону
# до того, как PyInstaller создаст exe. Это нужно для добавления в файл даты и прочей информации.
*.manifest
*.spec

# Логи установщика
pip-log.txt
pip-delete-this-directory.txt

# Модульные тесты / отчеты по покрытию
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/

# Переводы
*.mo
*.pot

# Всякое на Django:
*.log
local_settings.py
db.sqlite3

# Всякое на Flask:
instance/
. webassets-cache

# Всякое на Scrapy:
.scrapy

# Sphinx-документация
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# pyenv
.python-version

# Schedule-файл Celery Beat
celerybeat-schedule

# Проанализированные файлы SageMath
*.sage.py

# Окружения
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Настройки Spyder Project
.spyderproject
.spyproject

# Настройки Rope Project
.ropeproject

# Документация mkdocs
/site

# mypy
.mypy_cache/

Вот и все.

from setuptools import setup, find_packages
from io import open
from os import path

import pathlib
# Директория, в которой содержится этот файл
HERE = pathlib.Path(__file__).parent

# Текст README-файла
README = (HERE / "README.md").read_text()

# Автоматически собирает в requirements.txt все модули для install_requires
with open(path. join(HERE, 'requirements.txt'), encoding='utf-8') as f:
all_reqs = f.read().split('\n')

install_requires = [x.strip() for x in all_reqs if ('git+' not in x) and (
not x.startswith('#')) and (not x.startswith('-'))]
dependency_links = [x.strip().replace('git+', '') for x in all_reqs \
if 'git+' not in x]
setup (
name = 'cver',
description = 'A simple commandline app for searching and looking up opensource vulnerabilities',
version = '1.0.0',
packages = find_packages(), # list of all packages
install_requires = install_requires,
python_requires='>=2.7', # any python greater than 2.7
entry_points='''
[console_scripts]
cver=cver.__main__:main
''',
author="Oyetoke Toby",
keyword="cve, vuln, vulnerabilities, security, nvd",
long_description=README,
long_description_content_type="text/markdown",
license='MIT',
url='https://github.com/CITGuru/cver',
download_url='https://github.com/CITGuru/cver/archive/1. 0.0.tar.gz',
dependency_links=dependency_links,
author_email='[email protected]',
classifiers=[
"License :: OSI Approved :: MIT License",
"Programming Language :: Python :: 2.7",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.7",
]
)

Публикация на PyPI

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

Загружать Python-пакеты на PyPI мы будем с помощью специального инструмента — Twine. По идее, вы уже установили его на одном из предыдущих этапов. Если нет, то это можно сделать через pip install twine.

Создание и локальное тестирование пакета на тестовом сервере

Python-пакеты, опубликованные на PyPI, не распространяются в виде «голого» кода. Они оборачиваются в дистрибутивы. Самыми распространенными форматами дистрибутивов в Python являются Wheels и Source Archives.

Wheels — это zip-архив с кодом и готовыми расширениями. Source Archives содержит исходный код и вспомогательные файлы, упакованные в tar-архив.

Для локального тестирования пакета выполните:

python setup.py install

Теперь мы можем использовать его как:

cver search python

Для проверки пакета на тестовом сервере PyPI нужно сгенерировать сборку для локального тестирования. При создании этой сборки сгенерируются архивы Wheels и Source Archives.

Создание сборки:

python setup.py sdist bdist_wheel

Код ниже сгенерирует два файла в директории dist:

cvecli/

└── dist/
├── cver-1.0.0-py3-none-any.whl
└── cver-1.0.0.tar.gz

Затем воспользуемся Twine. Теперь мы можем загрузить пакет на тестовый сервер PyPI:

twine upload — repository-url https://test.pypi.org/legacy/ dist/*

Затем у вас спросят логин и пароль.

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

Для установки из TestPyPI выполните следующую команду:

pip install -i https://test.pypi.org/simple/ cver==1.0.0

В тестовой среде вы можете проверить все команды и убедиться в их правильности перед публикацией пакета на рабочем сервере.

Протестировав все команды локально, переходите к публикации пакета на рабочем сервере:

twine upload dist/*

В процессе загрузки укажите свой логин и пароль. Вот и все!

Теперь пакет можно установить через:

pip install cver

Поздравляю! Ваш пакет был опубликован на PyPI. Просмотреть его можно здесь!

В этой статье я пошагово объяснил процесс создания и публикации консольного приложения на Python.

Читайте также:

  • Проверка типов в Python
  • Attr — одна из лучших практик объектно-ориентированного Python
  • 15 Python пакетов, которые нужно попробовать

Читайте нас в телеграмме, vk и Яндекс. Дзен

Перевод статьи Oyetoke Tobi Emmanuel: How to Build And Publish Command-Line Applications With Python

консольные приложения с человеческим лицом / Хабр

Философы говорят, что людей нужно оценивать не по тому, как высоко они могут забраться, а по тому, как низко они могут пасть.

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

Сегодня мы поговорим о том, как сделать лучше программы, на которые большинству плевать — одноразовые консольные утилитки и скрипты.


python-nubia

Библиотека от второй по значимости в мире корпорации добра — Facebook. Тамошних инженеров тоже порядком утомил хаос в консольных приложениях, поэтому они решили снабдить их интерактивным интерфейсом. Конечно же, текстовым.


  • Автокомплит для функций, доступных в вашем консольном скрипте.
  • Можно подключать автокомплит на уровне терминала (работает в bash и zsh).
  • Приятный и красивый статус бар, который покажет пользователю, что же происходит.
  • Подсказки и валидации по наборам аргументов функций и их типам.

Termgraph

С выводом информации в консоль у многих вообще беда. Как говорилось выше, дело часто сводится к простому выводу print(). Читать такое, конечно, не очень удобно.

Для того, чтобы сделать отрисовку того, что происходит в программе, есть либа Termgraph

Она позволяет делать такие вот картинки в терминале

Или такие, посложнее

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


Fabric

Скрипты для выполнения на удаленных машинах — отдельная боль. Конечно, мы живем в веке DevOps, когда кучи задач решаются с помощью Salt и Ansible. Но бывает и такое, что нужно регулярно логиниться на кластер удаленных тачек и выполнять там пачки команд. Для этого и есть fabric


  • Поддержка разных списков хостов — можно выполнять команды на серверах БД, в кластере приложения — просто пропишите удаленные тачки в скрипт.
  • Разные политики авторизции для тачек — можно юзать и ключи, и пароли.
  • Разбивка скрипта на подкоманды, группировка подкоманд в команды побольше — можно делать сколь угодно сложную логическую структуру кода, который вы хотите запускать.
  • И, конечно же, можно мешать в коде команды терминала и питонячий код!

Fabric построен вокруг Paramiko и вообще вы можете выполнять команды с помощью этой низкоуровневой библиотеки общения по SSH. Но Fabric дает необходимый уровень абстракции, который позволяет делать понятным и легкоиспользуемым.


python-prompt-toolkit

Эта либа превращает простой скрипт в реально мощное консольное приложение.

Например, можно добавить строку запроса команд в текстовый интерфейс.

from prompt_toolkit import prompt
while 1:
    user_input = prompt('>')
    print(user_input)

А после этого можно добавить историю использованных команд, прямо как в вашем терминале.

from prompt_toolkit import prompt
from prompt_toolkit.history import FileHistory
while 1:
    user_input = prompt('>', 
                        history=FileHistory('history.txt'),
                       )
    print(user_input)

А можно сделать автоподсказки строк из истории ввода.

from prompt_toolkit import prompt
from prompt_toolkit.history import FileHistory
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
while 1:
    user_input = prompt('>', 
                        history=FileHistory('history.txt'),
                        auto_suggest=AutoSuggestFromHistory(),
                       )
    print(user_input)

И научить автоподсказки определенным предустановленным командам.

from prompt_toolkit import prompt
from prompt_toolkit.history import FileHistory
from prompt_toolkit.auto_suggest import AutoSuggestFromHistory
from prompt_toolkit.contrib.completers import WordCompleter
SQLCompleter = WordCompleter(['select', 'from', 'insert', 'update', 'delete', 'drop'],
                             ignore_case=True)
while 1:
    user_input = prompt('SQL>', 
                        history=FileHistory('history.txt'),
                        auto_suggest=AutoSuggestFromHistory(),
                        completer=SQLCompleter,
                        )
    print(user_input)

Либа крайне простая и дает возможность сделать свой классный и полностью кастомизируемый интерфейс.


Зачем это?

Внимательное отношение к, казалось бы, одноразовым программам позволит вам писать не код на выброс, а консольные инструменты, которые легко можно использовать повторно потом. Это экономит время и, конечно же, делает работу с вашими скриптами намного приятней.

Использование Application Console

  1. Использование Oracle Application Container Cloud Service
  2. Администрирование приложений
  3. Используйте консоль приложения

Консоль приложения предоставляет доступ ко всем параметрам конфигурации приложения, включая статические значения манифеста приложения и зависимости службы. Вы можете запускать, останавливать и перезапускать приложения, а также просматривать журнал активности в Консоли программы.

  1. Перейти на страницу приложений.

    Страница появляется после входа в систему или при нажатии на ссылку Приложения в верхней части любой страницы. См. раздел Доступ к облачной службе контейнера приложений Oracle.

  2. В списке приложений щелкните имя нужного приложения.

В верхней части консоли приложения находятся имя приложения, меню приложения и URL-адрес приложения.

Тип: рабочая метка вместо URL указывает на рабочее приложение. См. Подготовка рабочего приложения к развертыванию в «Разработка для Oracle Application Container». Облачная служба .

В меню приложения отображаются следующие параметры:

  • Открыть приложение — запуск приложения с использованием URL-адреса.

  • View Service Metrics — открывает график мониторинга, на котором отображается использование памяти или данные о памяти. См. раздел Просмотр метрик службы для приложения.

  • Start — Запускает все экземпляры приложения.

  • Stop — Останавливает все экземпляры приложения.

  • Restart — перезапускает все экземпляры приложения.

  • Просмотр активности — отображение журнала активности.

Если развернуть значок сведений о службе рядом со значком меню, отобразится следующая дополнительная информация:

  • Расположение приложения в Oracle Cloud Инфраструктурное объектное хранилище Classic

  • Пользователь, создавший приложение

  • Заметки о приложении, введенные при создании приложения, если таковые имеются

  • Отметка даты и времени создания приложения

  • Частота измерения приложения, Ежечасно или Ежемесячно

  • Идентификационное доменное имя приложения

В следующей таблице описаны основные страницы, доступные в Консоли программы.

По умолчанию страница обзора программы открывается при доступе к Консоли программы.

Элемент Описание

Обзор

Обзор приложения. Просмотр и изменение экземпляров приложений и информации о памяти.

См. Обзор страницы обзора приложений.

развертываний

Сведения о развернутом приложении. Просмотр и изменение привязок службы, переменных среды, команды запуска приложения и истории приложения.

См. страницу «Изучение развертываний приложений».

Администрация

Администрирование приложений. Применяйте обновления службы и среды выполнения, просматривайте и загружайте журналы приложений, а также просматривайте и загружайте записи Java Flight Recorder для приложений Java.

См. раздел «Изучение страницы администрирования приложений».

Остановка, запуск и перезапуск приложения

Остановить, запустить и перезапустить приложение можно из сервисной консоли, консоли приложения или REST API. В этом разделе описывается использование консоли службы и приложения.

Остановка приложения останавливает запущенные экземпляры и освобождает память. Измерение ресурсов также останавливается, что полезно для почасовых подписок. Пока приложение остановлено, вы не можете выполнять следующие действия:

  • Увеличение или уменьшение экземпляров распределения

  • Управление выделением памяти для экземпляров

  • Повторно разверните приложение

  • Добавить, изменить или удалить привязки службы

  • Добавить, изменить или удалить переменные среды

  • Создание журналов и записей

Запуск приложения запускает все остановленные экземпляры, а балансировщик нагрузки запускает маршрутизацию трафика. Также начинается учет ресурсов. Приложение запускается по умолчанию при его создании.

Перезапуск приложения останавливает его и сразу запускает. У вас есть два варианта:

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

  • Параллельный перезапуск — экземпляры останавливаются и запускаются одновременно. Приложение ненадолго отключается, но общее время перезапуска сокращается.

У вас есть следующие варианты для всех действий, требующих перезапуска приложения:

  • Перезапуск приложения

  • Масштабирование памяти вверх или вниз

  • Обновление среды выполнения приложения

  • Обновление Oracle Application Container Cloud Сервис

  • Обновление приложения, включающее:

    • Загрузка нового архива

    • Изменение команды запуска

    • Изменение привязки службы

    • Изменение переменных среды

Настройка режима прокрутки в файле manifest. json вызывает последовательный перезапуск после повторного развертывания. См. Создание файлов метаданных в «Разработка для контейнера приложений Oracle». Облачная служба .

Чтобы остановить, запустить и перезапустить приложение из сервисной консоли:

  1. Откройте сервисную консоль.
  2. В таблице Приложения щелкните рядом с приложением, которое вы хотите остановить, запустить или перезапустить.
  3. Выберите нужный пункт меню.
  4. В диалоговом окне подтверждения нажмите OK.
  5. Если вы выбрали пункт меню «Перезапуск», выберите «Последовательный перезапуск» или «Параллельный перезапуск» в диалоговом окне «Перезапустить приложение», затем нажмите «Перезапустить».

Для остановки, запуска и перезапуска программы из Консоли программы:

  1. Откройте Консоль программы.

  2. В таблице Приложения щелкните имя приложения.

  3. В заголовке Консоли приложения щелкните рядом с путем к приложению.

  4. Выберите нужный пункт меню.

  5. В диалоговом окне подтверждения нажмите OK.

  6. Если вы выбрали пункт меню «Перезапуск», выберите «Последовательный перезапуск» или «Параллельный перезапуск» в диалоговом окне «Перезапустить приложение», а затем нажмите «Перезапустить».

В зависимости от вашего действия в разделе «Действия» на странице «Обзор» создается событие.

Удаление приложения

Вы можете удалить приложение с помощью сервисной консоли.

  1. Откройте сервисную консоль.
  2. В таблице Приложения щелкните рядом с приложением, которое вы хотите удалить.
  3. Щелкните Удалить.

    Внимание! Удаление приложения нельзя отменить.

Все запущенные экземпляры развернутого приложения остановлены. Развернутое приложение и данные его конфигурации удаляются.

Новейшие вопросы о «консольном приложении» Задавать вопрос

Консольное приложение — это компьютерная программа, предназначенная для использования через текстовый компьютерный интерфейс, такой как текстовый терминал, интерфейс командной строки некоторых операционных систем (Unix, DOS и т. д.) или текстовый интерфейс, включенный в большинство Операционные системы с графическим интерфейсом пользователя (GUI), такие как консоль Win32 в Microsoft Windows, Terminal в Mac OS X и xterm в Unix.

  • Узнать больше…
  • Лучшие пользователи
  • Синонимы

7176 вопросы

Новейший

Активный

Баунти

Без ответа

Сортировать по

Нет ответов

Ответ не принят

Имеет награду

Отсортировано по

Новейший

Последние действия

Наивысший балл

Самый частый

Щедрость скоро закончится

Отмечен

Мои просматриваемые теги

Следующие теги:

0 голоса

0 ответы

11 Просмотры

Как отправить строку в качестве значения поля ввода веб-сайта?

импортировать ‘package:html/parser. dart’ показать синтаксический анализ; импортировать ‘package:http/http.dart’ как http; недействительным основным () асинхронным { окончательный ответ = ожидайте http.get(Uri.parse(‘https://bitwarden.com/password-strength/’)…

  • дротик
  • http
  • консольное приложение

-1 голоса

0 ответы

35 Просмотры

Как запустить команду git с помощью С# и сохранить их в базе данных [закрыто]

Я хочу запустить команду ниже git в консольном приложении С#. и сохранить результат в базе данных. git ls-remote —tags https://bitbucket.mycom.com/scm/test/src.git Есть ли способ запустить команды git в С#…

  • c#
  • .net
  • git
  • консольное приложение

3 голоса

2 ответы

181 Просмотры

Преимущество async/await по сравнению с Task.

Result в консольных приложениях

Мы широко использовали async/await, потому что нам нужен доступ к сторонним асинхронным API. Мы не занимаемся UI и редко используем ASP.NET, в основном пишем консольные приложения. Поэтому большинство наших…

  • c#
  • асинхронное ожидание
  • консольное приложение

-2 голоса

1 отвечать

63 Просмотры

Как мне внедрить службы в консольное приложение? [закрыто]

Я использовал DI в порядке в asp.net/razor/blazor, и теперь я рассматриваю возможность его использования в консольном приложении С#. Нет проблем с его настройкой, но мой вопрос в том, как лучше всего использовать его в консольном приложении. Где объект…

  • c#
  • внедрение зависимостей
  • консольное приложение

0 голоса

2 ответы

43 Просмотры

Как сохранить пользовательский ввод в массив во время выполнения?

Я много работал со списками, поэтому я сделал это с этим, но я пытаюсь использовать другую структуру данных, такую ​​​​как массив. Мой код ниже работает нормально, и когда я ввожу свое полное имя + номер телефона,…

  • С#
  • консольное приложение

-4 голоса

0 ответы

57 Просмотры

Подключиться к локальному устройству Tuya Wifi и отправить команды (C#)

Я пытаюсь подключиться к смарт-устройству Tuya в локальной сети через Wi-Fi без использования Tuya Cloud Api. потому что мне нужно отправить большое количество запросов. Я пытаюсь использовать TCP строка IP = «198.168.1.77&…

  • c#
  • консольное приложение
  • туя

0 голоса

0 ответы

27 Просмотры

Информация о внешнем диске не записывается в файл XML

После успеха с помощью предыдущего вопроса мне удалось успешно запустить консольное приложение VB, которое будет извлекать информацию о диске и записывать ее в файл xml. Когда нет внешних…

  • xml
  • vb.net
  • консольное приложение

0 голоса

0 ответы

13 Просмотры

Как заставить раздел

работать в моей консольной программе?

У меня есть консольное приложение С#, которое запускается по расписанию на сервере. Приложение обрабатывает данные в базе данных и вызывает сторонний SOAP API. Мне нужно захватить XML, который…

  • c#
  • консольное приложение
  • мыльный клиент

0 голоса

1 отвечать

20 Просмотры

Как правильно записать элементы набора данных в файл XML

Мне удалось запустить мою программу, как я хотел бы. Проблема, с которой я сталкиваюсь, заключается в том, что я пишу в файл XML. Я чувствую, что у меня все настроено правильно, чтобы записать содержимое …

  • xml
  • vb.net
  • datatable
  • консольное приложение
  • datarow

-1 голоса

0 ответы

80 Просмотры

Запустите консольное приложение Net Core 6 с библиотекой классов, используя настройки приложения

У меня есть консольное приложение, созданное с использованием .NET Core 6 с использованием библиотеки классов *.dll. Это размещается в службе приложений Azure как веб-задание и хорошо работает, получая настройки приложения в службе приложений и…

  • c#
  • .net-core
  • консольное приложение
  • azure-webjobs
  • appsettings

-1 голоса

1 отвечать

37 Просмотры

Есть ли способ вернуть ошибку в моем консольном приложении, прежде чем переходить к следующему запросу

У меня практически вся программа написана, но я пытаюсь сделать ее чище. В меню выбора животных с параметрами 1, 2, 3 или 4 я бы хотел, чтобы оно немедленно возвращало ошибку, если другое…

  • С#
  • консольное приложение

-1 голоса

0 ответы

48 Просмотры

Код C++ для определения того, какая программа имеет доступ к камере и микрофону

Я пытаюсь написать консольное приложение С++, чтобы определить, какая программа на компьютере имеет доступ к камере и микрофону. Есть ли способ сделать это? Я нашел эту ссылку, объясняющую использование…

  • c++
  • windows
  • консоль
  • консольное приложение

0 голоса

0 ответы

46 Просмотры

Форматирование строк С# в консоли отличается от текстового файла

Может ли кто-нибудь сказать мне, почему следующие скриншоты отличаются, хотя они представляют собой одну и ту же строку? Первый — это вывод из Console. WriteLine(myString), а второй — из того же…

  • С#
  • .net
  • консольное приложение

0 голоса

0 ответы

9 Просмотры

Ошибка: не удалось создать контейнерную задачу: не удалось создать прокладку: сбой создания среды выполнения OCI: exec: «dotnet»: исполняемый файл не найден в $ PATH: неизвестно

ОТ mcr.microsoft.com/dotnet/sdk:6.0 AS build-env РАБОЧИЙКАТАЛОГ /приложение КОПИРОВАТЬ ConsoleApp/RuleEngine/RuleEngineConsole/*.csproj ./ КОПИРОВАТЬ . ./ ЗАПУСТИТЬ восстановление дотнета ЗАПУСК dotnet publish —runtime alpine-x64 ConsoleApp/…

  • asp.net
  • докер
  • .net-core
  • консольное приложение

2 голоса

2 ответы

73 Просмотры

Не удалось запустить образ консоли Docker .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *