Тарифы Услуги Сим-карты

Как писать и как запускать скрипты PowerShell. Запуск скриптов по расписанию. Создание нового файла скрипта

С помощью скриптов R можно быстро и бесплатно собирать данные из API различных сервисов или рекламных площадок и записывать их в базу данных. Но если вы регулярно пользуетесь скриптами, то есть ли смысл каждый раз запускать их вручную?

Я расскажу, как настроить запуск скриптов R с определенным интервалом в операционной системе Windows.

1. Как добавить путь к R-консоли в переменную окружения PATH?

PATH — переменная окружения Unix-подобных операционных систем, DOS, OS/2 и Microsoft Windows, представляющая собой набор директорий, в которых расположены исполняемые файлы. В основном, каждый выполняемый процесс или сеанс пользователя имеет собственную переменную PATH.

Эта инструкция относится к операционным системам Windows 8 и 10, но вы без проблем можете подробные руководства и для любой другой версии Windows.
1.1. В строке «Поиск» найдите «Система (Панель управления)» и нажмите на ссылку «Дополнительные параметры системы».

1.2. В окне свойств системы нажмите на кнопку «Переменные среды...».

1.3. В разделе «Переменные среды» кликните на переменную PATH и нажмите «Изменить». Если переменной PATH не существует, нажмите «Создать».

1.4. Добавьте в переменную путь к папке с файлом «R.exe ».

Bat-файл, по сути, похож на файл с расширением exe, но его код более простой и состоит из некоторых командных строк.

Создать bat-файл довольно просто. Можно записать команду запуска в обычный текстовый файл с расширением TXT, сохранить его и поменять расширение на «.bat ». Я опишу другой способ — создание bat-файла с помощью бесплатного блокнота Notepad++.

2.1. Откройте Notepad++ (скачать его можете по ссылке).

2.2. Введите следующую команду:

@echo off R CMD BATCH C:\R\myscript.R

Команда «@echo off » отключает вывод сообщений в командной строке при работе скрипта, вы можете изменить эту команду на «@echo on » и наблюдать за выполнением скрипта в ходе его работы.

Команда «R CMD BATCH » запускает выполнение R скрипта.

Во второй строке вместо «C:\R\myscript.R» пропишите путь к вашему файлу со скриптом R.

В результате файл будет выглядеть так:

2.3. Сохраните созданный текстовый файл с расширением BAT. Для этого в меню Notepad++ выберите пункт «Файл» — «Сохранить как» — «Batch file (bat, cmd, nt)».

Если вы не хотите, чтобы при автозапуске R-скрипта на экране появлялось окно командной строки, то скомпилируйте ваш bat-файла в exe — в таком случае скрипт будет работать в фоновом режиме и не будет вам мешать.

3.1. Скачайте бесплатную утилиту «Bat To Exe Converter» по ссылке .

3.2. Укажите bat-файл, который необходимо скомпилировать, а также путь и название будущего exe-файла.

3.3. В области «Видимость приложения» установите переключатель в положение «Невидимое приложение».

3.4. При желании установите иконку для вашего файла.

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

В качестве иконки можете использовать любое изображение в формате ICO или же нарисовать самостоятельно в бесплатном онлайн-редакторе .

Нажмите кнопку «Компилировать».

4. Настройте планировщик задач Windows

Заключительный этап настройки — добавить задачу в планировщик задач Windows.

Планировщик задач Windows — встроенная утилита (аналог линуксового CRON), с помощью которой можно запланировать в определенное время с заданными условиями:

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

4.1. Чтобы открыть планировщик задач, скопируйте в адресную строку открытой папки путь «%windir%\system32\taskschd.msc /s ».

4.2. В правой части планировщика выберите пункт «Создать задачу...».

4.3. На вкладке «Общие» в диалоговом окне «Создание задачи» введите название и при необходимости краткое описание.

4.4. На вкладке «Триггеры» настройте расписание запуска скрипта: нажмите «Создать» и установите, к примеру, повтор запуска скрипта каждый понедельник в 12:45.

На этом процесс настройки запуска R скриптов по расписанию закончен. Если вы все сделали правильно, в списке появится новая задача.

Вывод

С этим руководством настройка автозапуска займет не более десяти минут, и поможет сэкономить время в будущем.

Алгоритм действий:

  • В переменной окружения PATH пропишите путь к консоли R.
  • Создайте скрипт R, который будет выполнять нужные действия (например, сохранять результат в файл формата CSV или записывать в базу данных).
  • Создайте bat-файл, в котором будет прописан путь к скрипту R.
  • Скомпилируйте ваш bat-файла в exe, чтобы он запускался в фоновом режиме и не отвлекал от работы.
  • В планировщике задач Windows добавьте повторяющееся задание на запуск bat-файла и установите определенный интервал времени.
  • Обрабатывать огромные массивы данных, агрегировать и передавать их в любые базы — просто и быстро, если вы правильно организовали свою работу.

    Инструкция

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

    Теперь подробнее о скрипт ах, исполняемых сервером.
    Установить веб-сервер можно и на своём компьютере. Ему будет не нужно даже соединение с - такой сервер называется «локальным». Это очень удобно для написания и скрипт ов на серверных языках (php, perl, и т.д.). В сети можно найти дистрибутивы (комплекты для установки) как платных, так и бесплатных серверов для персонального использования - например, Zend, Денвер, XAMPP, AppServ и т.д. Но если постоянный доступ в интернет - не проблема, то можно обойтись без , а полнообъёмным веб-сервером какого-либо хостинг-провайдера. Обычно эта услуга платная, но не очень дорогая. Зато вы будете иметь возможность пользоваться массой дополнительных модулей, плагинов, обработчиков статистики и других полезностей ничуть не заботясь об их установке и поддержании в рабочем состоянии.

    И, наконец, о сценариях, исполняемых .
    Что касается клиентских скрипт ов, то мы можем написать и запустить простейший из них прямо сейчас, ничего не покупая, не устанавливая и не запуская. Делаем так: первым делом открываем любой текстовый редактор, например блокнот. Пишем в нём всего 3 строки кода:
    alert("JavaScript запущен!")
    Теперь сохраняем этот код в файле с расширением html (например, js-test.html) и запускаем как обычно - двойным щелчком мыши. По расширению html (HyperText Markup Language - "язык разметки гипертекста") операционная система тип файла и запустит назначенную для запуска таких файлов программу - это браузер. А интерпретатор языка в браузере прочтёт и исполнит сценарий. Результат будет выглядеть, как на изображении.

    Видео по теме

    Обратите внимание

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

    Написать или подобрать полезный веб-скрипт – это полдела, надо ещё найти способ его выполнить. Давайте рассмотрим подробнее, что нужно для исполнения наиболее распространённых типов скрипт ов.

    Инструкция

    Обязательным условием выполнения любого скрипт а (то есть сценария), естественно, является наличие самого исполнителя. Применительно к языкам -программирования таким исполнителем будет интерпретатор скрипт ового языка. В зависимости от того, где должен исполняться сценарий, интерпретатор языка может быть либо частью серверного программного обеспечения, либо частью программного кода браузера. Поэтому чтобы выполнить любой серверный скрипт (например, php- или perl-скрипт ) необходимо иметь запущенный сервер. Сервер можно подобрать в сети и у себя в . Очень популярен, к примеру, среди русскоязычных программистов из-за своей относительной простоты и бесплатности серверного программного обеспечения под названием «Денвер». А можно не морочиться с установкой у себя, а воспользоваться услугами хостинг-провайдера. Провайдер даст вам доступ к , а все заботы по его поддержанию и обслуживанию вас не будут касаться. Обычно такие платны, но не дороги.

    По- обстоит дело с «клиентскими» скрипт ами. Это сценарии, которые должны выполняться прямо в . Чтобы выполнить такой скрипт , написанный, например, на языке JavaScript кроме браузера да простого текстового редактора (подойдёт стандартный блокнот) ничего больше не требуется. Вот, к примеру, простейший скрипт : var now = new Date();
    document.write ("Этот скрипт выплнен в " + now.getHours() + " часов " + now.getMinutes() + " минут");Чтобы его выполнить, достаточно сохранить этот код в файле с расширением html (например, test.html) а затем запустить двойным щелчком мыши. Расширение html (HyperText Markup Language - «язык разметки гипертекста») в операционной системе зарезервировано за файлами, содержащими веб-страницы. Поэтому ОС запустит ваш браузер и передаст ему адрес этого файла, а браузер распознает скрипт , прочтёт и выполнит его сценарий. В результате мы увидим такую же простую, как и скрипт в ней содержащийся:

    Видео по теме

    Скрипты (или сценарии) призваны облегчить пользователю выполнение повторяющихся действий. Процедура запуска скрипта является стандартной операцией и не предполагает углубленных познаний ресурсов компьютера или изучения специальных языков программирования.

    Инструкция

    Нажмите кнопку «Пуск» для вызова главного меню системы и перейдите в пункт «Выполнить» для инициации процедуры запуска скрипта через консоль.

    Введите значение cmd в поле «Открыть» и нажмите кнопку OK для подтверждения запуска инструмента командной строки.

    Ознакомьтесь с возможными командами консоли. Для получения информации введите значение ntcmds в текстовое поле командной строки и нажмите функциональную клавишу Enter для подтверждения выполнения команды.

    Используйте значение cd для введения команды запуска выбранного скрипта. Для этого укажите в команде путь к месту сохранения выбранного файла: cd c:script. Затем нажмите функциональную клавишу Enter для подтверждения своего выбора.

    Укажите имя необходимого скрипта в текстовом поле инструмента «Командная строка» и повторите нажатие функциональной клавиши Enter для применения выбранных изменений.

    Загрузите и установите на компьютер программу Active Pearl для упрощения запуска выбранных скриптов.

    Создайте копию необходимого скрипта и сохраните ее в файле с расширением *.pl.

    Выполните двойной клик мыши на сохраненном файле для запуска выбранного скрипта или вернитесь в консоль Windows для выполнения альтернативного метода запуска.

    Введите значение c:perlinperl.exe имя_скрипта.pl в текстовое поле командной строки и нажмите функциональную клавишу Enter для подтверждения выполнения команды запуска выбранного скрипта. В этом случае c:perlinperl.exe - полный путь к интерпретатору Active Perl, установленному раньше, а имя_скрпта.pl - сохраненный файл с нужным расширением.

    Видео по теме

    Полезный совет

    Встроенным средством для управления скриптами является Windows Script Host (WSH), представляющий из себя набор инструментов для запуска скриптов. Встроенными интерпретаторами скриптов являются VBScipt и JScript. Первый предполагает работу через графический интерфейс системы, второй - через инструмент командной строки.

    Источники:

    • Как запускать скрипты через консоль
    • Как запускать Perl скрипты под Windows

    При наличии навыка управлять консольным приложением можно эффективнее, чем графическим. Такие приложения существуют для всех распространенных операционных систем, включая Linux и Windows.

    Инструкция

    Запустить консольное приложение в Linux можно в обычном и полноэкранном режиме. В первом случае для этого потребуется запустить эмулятор консоли. Для этого нажмите на кнопку вызова меню, которая в KDE выглядит как шестерня, в Gnome - как ладонь, а в других графических интерфейсах может иметь иной вид. В меню найдите приложение xterm, nxterm, Konsole или аналогичное. На экране появится эмулятор консоли с командной строкой. Если вы желаете запустить программу не от своего имени, а от имени другого пользователя, введите login, после чего наберите имя и пароль. Чтобы снова получить возможность запускать программы от своего имени, введите logout.

    Для перехода в полноэкранную консоль нажмите Ctrl+Alt+F2. Введите логин и пароль, и появится командная строка. Вернуться обратно в графический режим можно, нажав Alt+F5 либо Alt+F7 (в зависимости от дистрибутива).

    В Windows для запуска командной строки нажмите кнопку Пуск, найдите в меню пункт Выполнить и введите имя исполняемого файла - cmd. Откроется окно с командной строкой. Нажатием сочетания клавиш Ctrl+Enter можно переключаться между обычным и полноэкранным режимом.

    С этой статьей вы не научитесь программировать и даже не напишите как таковую программу, но найдете здесь отличные VBS скрипты и BAT файлы, которые без проблем напишете в обычном блокноте Windows, сможете усовершенствовать по своему, потом похвастаться перед друзьями и близкими. Возможно это поднимет вам настроение и вы отлично проведете время.

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

    Немного терминологии:

    • VBS - язык программирования для создания скриптов в ОС Windows, создается/редактируется в Блокноте Windows, имеет разрешение ".vbs". Думаю, продолжать не имеет смысла, ибо это мало о чем скажет, особенно новичкам. Интересующимся - .
    • BAT - пакетный файл, в народе просто "батник". Расширение файла ".bat". Дальше аналогично - .

    Данных расширений (vbs, bat) файлы создаются во всеми известном Блокноте Windows (Notepad). Для большего удобства создания скриптов рекомендуется использовать усовершенствованный (скажем так) блокнот - Notepad++. Он удобен подсветкой синтаксиса большого количества языков программирования, если вам это мало о чем говорит, то скачайте и пишите в нем - ошибок сделаете меньше в коде, ну или будет их проще найти, чем в том же мало функциональном Блокноте Windows.

    Для наглядности пример (слева - Блокнот Windows, справа - Notepad++):

    Приступим

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

    Научим компьютер здороваться

  • Открываем Блокнот (или Notepad Plus Plus).
  • Копируем в вставляем код:

    Set sapi=CreateObject("sapi.spvoice")
    sapi.Speak "Hello!"

  • Обязательное условие: кавычки должны быть “такими”, «ёлочки» не подойдут, скрипт не будет обрабатываться и выйдет ошибка. Вместо слова "Hello" можете написать что угодно, даже по русски, при наличии русского голосового движка.
  • Дальше выбираем Файл - Сохранить как - Тип файла - Все файлы - название.vbs
  • Называйте файл как хотите, но не забудьте в конце прописать расширение - .vbs (пример - Privet.vbs).
  • Теперь пробуйте проверить свой скрипт - запустите файл двойным щелчок мыши.
  • Один нюанс: если вы прописали в кавычках слова русскими буквами, а при запуске произносится непонятно что, то у вас просто не установлен русский голосовой движок. Подробная установка и настройка голосового движка выходит за рамки нашей статьи, поэтому более подробно ознакомьтесь и вновь возвращайтесь сюда.

    Теперь, сделаем следующее: пропишем данный скрипт в автозагрузку, а это означает то, что при запуске компьютера вам будет произнесено написанное в программе слово (слова), если как в примере, то будет говорить - "Hello" при каждом включении компьютера. Как это сделать?

    Все просто, программу (скрипт) добавить в автозагрузку можно таким же образом, то есть через такой же VBS скрипт. Создаем файл в блокноте, копируем/вставляем (Ctrl+C/Ctrl+V) следующий код:

    Dim vOrg, objArgs, root, key, WshShell
    root = "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\"
    KeyHP = "Program"
    Set WshShell = WScript.CreateObject("WScript.Shell")
    WshShell.RegWrite root+keyHP,"C:\Privet.vbs /autorun"

    Изменяем путь до скрипта "говорилки", вот эту строчку - C:\Privet.vbs на свою. Прописываем где у вас лежит этот скрипт и как называется. Дальше сохраняем только что созданную мини программу в блокноте и запускаем. Все, теперь компьютер будет с вами здороваться пр каждом включении.

    Открыть дисковод

  • Открыть блокнот. Скопировать/Вставить следующий код:

    Set a = CreateObject("WMPlayer.OCX.7")
    Set b = a.CdromCollection
    Set c = b.Item(0)
    Set d = c.Eject

  • Сохранить с расширением.vbs
  • Запустить скрипт и откроется дисковод.
  • Есть более интересная модификация данного скрипта:

    Set WMPlayer = CreateObject("WMPlayer.OCX.7")
    do
    WMPlayer.CdRomCollection.Item(0).Eject()
    loop

    В данном случае будет все время открываться-закрываться CD/DVD-привод, на ноутбуках в этом случае будет открываться после каждого его закрытия.

    Внимание! Второй код (открытие-закрытие дисковода), некоторые антивирусы видят как вредоносную программу. Антивирус Касперского (в т.ч. и ) его видит именно так и уничтожает сразу же. В первом же случае (просто открытие дисковода) для антивирусных программ не является вредоносным скриптом.

    Чтобы прекратить автоматически открывать-закрывать дисковод необходимо:

  • Запустить диспетчер задач ( - Ctrl+Alt+Del).
  • Перейти на вкладку "Процессы".
  • Найти процесс wscript.exe - правая кнопка мыши - завершить процесс.
  • Игра

    Интересная находка из Сети - игра на VBS. Необходимо угадать число от 0 до 100. Скрипт автоматически при запуске задает (разгадывает) число, которое вам необходимо угадать и ввести в специальном окошке, при неправильном ответе даются подсказки, например меньше или больше.

    Ниже тот самый код который необходимо скопировать и вставить в блокнот, далее сохранить (расширение.vbs).

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

    Set y = CreateObject("Scripting.FileSystemObject")
    Set y = Nothing
    Do
    a = 0
    u = 0
    Randomize
    Number = Int((RND*99)+1)
    MsgBox "Я загадал число от 1 до 100, попробуй отгадать",64,"Угадайка"
    Do
    a = a + 1
    c = InputBox("Угадай число" & vbCrLf & vbCrLf & "Попытка: " & a & vbCrLf & vbCrLf & "Чтобы посмотреть результаты введите число!" & vbCrLf & vbCrLf & "Для выхода оставьте поле пустым" & vbCrLf & vbCrLf,"Угадайка")
    If c = "!" Then CreateObject("WScript.Shell").Run "notepad C:\Windows\Result.dll",3,True: Exit Do
    If c "" Then
    If IsNumeric(c) = True Then
    If CInt(c) < Number Then MsgBox "Нет,это не " & c & ". Я загадал число больше",64,"Угадайка"
    If CInt(c) > Number Then MsgBox "Нет,это не " & c & ". Я загадал число меньше",64,"Угадайка"
    If CInt(c) = Number Then
    Set y = CreateObject("Scripting.FileSystemObject")
    MsgBox ("Количество попыток: " & a)
    If MsgBox ("Правильно, это было число " & c & ". Начать заного?",36,"Угадайка") = 6 Then Exit Do Else WScript.Quit
    End If
    Else
    MsgBox "Это не число!",16,"Угадайка"
    a = a - 1
    End If
    Else
    a = a - 1
    l = MsgBox ("Ты ничего не ввел. Выйти из программы?",36,"Угадайка")
    If l = 6 Then WScript.Quit
    End If
    Loop
    loop

    Ну и перед тем как переходить к батникам (.BAT) воспользуемся самым полезным VBS скриптом из всех перечисленных в этой статье.

    Скрипт закрывающий wscript.exe

    Сам скрипт:

    Set TaskKill = CreateObject("WScript.Shell")
    TaskKill.Run "TaskKill /f /im wscript.exe"

    По сути он делает тоже самое, что чуть выше объяснялось в диспетчере задач, как например нельзя просто взять и закрыть надоедливый скрипт открывающий-закрывающий дисковод, а запустив данный скрипт все запущенные будут закрыты. Это как клин клином вышибают.

    Немного познакомились с VBS скриптами и о том как их писать в блокноте, теперь рассмотрим несколько примеров использования BAT файлов (далее - батник).

    Совсем простой батник состоящий всего из одной строки.

  • Открываем Блокнот.
  • Пишем следующий код:

    shutdown -s -t 1 -c -f

  • Далее Файл - Сохранить как - нзвание.bat
  • Обратите внимание на расширение файла, это уже не VBS скрипт, а батник, по этому в конце названия прописываем.bat (Пример compoff.bat).
  • Запускаем только что созданный батник двойным щелчком мыши и компьютер выключится (Завершение работы).
  • Есть такой вариант кода:

    shutdown -r -t 1 -c -f

    Все также, прописываем в блокноте, сохраняем с расширением.bat и после запуска компьютер перезагрузится (обычная перезагрузка компьютера).

    Удаление обновлений

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

    @echo
    echo
    echo Step 1: Delete Updates Telemetry
    wusa /uninstall /kb:3068708 /quiet /norestart
    wusa /uninstall /kb:3022345 /quiet /norestart
    wusa /uninstall /kb:3075249 /quiet /norestart
    wusa /uninstall /kb:3080149 /quiet /norestart

    Таким образом можно удалить абсолютно любое обновление, даже назойливое KB971033 которое проверяет .

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

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

    До сих пор мы вводили имена скриптов в командную строку и нажимали Enter, что приводило к немедленному запуску программ, но это - не единственный способ вызова сценариев. Сегодня мы поговорим о том как скрипт может работать с сигналами Linux, о различных подходах к запуску скриптов и к управлению ими во время работы.

    Сигналы Linux В Linux существует более трёх десятков сигналов, которые генерирует система или приложения. Вот список наиболее часто используемых, которые наверняка пригодятся при разработке сценариев командной строки.
    Код сигнала
    Название
    Описание
    1
    SIGHUP
    Закрытие терминала
    2
    SIGINT
    Сигнал остановки процесса пользователем с терминала (CTRL + C)
    3
    SIGQUIT
    Сигнал остановки процесса пользователем с терминала (CTRL + \) с дампом памяти
    9
    SIGKILL
    Безусловное завершение процесса
    15
    SIGTERM
    Сигнал запроса завершения процесса
    17
    SIGSTOP
    Принудительная приостановка выполнения процесса, но не завершение его работы
    18
    SIGTSTP
    Приостановка процесса с терминала (CTRL + Z), но не завершение работы
    19
    SIGCONT
    Продолжение выполнения ранее остановленного процесса

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

    Сигнал SIGINT приводит к временной остановке работы. Ядро Linux перестаёт выделять оболочке процессорное время. Когда это происходит, оболочка уведомляет процессы, отправляя им сигнал SIGINT .

    Bash-скрипты не контролируют эти сигналы, но они могут распознавать их и выполнять некие команды для подготовки скрипта к последствиям, вызываемым сигналами.

    Отправка сигналов скриптам Оболочка bash позволяет вам отправлять скриптам сигналы, пользуясь комбинациями клавиш на клавиатуре. Это оказывается очень кстати если нужно временно остановить выполняющийся скрипт или завершить его работу.Завершение работы процесса Комбинация клавиш CTRL + C генерирует сигнал SIGINT и отправляет его всем процессам, выполняющимся в оболочке, что приводит к завершению их работы.

    Выполним в оболочке такую команду:

    $ sleep 100
    После этого завершим её работу комбинацией клавиш CTRL + C .


    Завершение работы процесса с клавиатуры Временная остановка процесса Комбинация клавиш CTRL + Z позволяет сгенерировать сигнал SIGTSTP , который приостанавливает работу процесса, но не завершает его выполнение. Такой процесс остаётся в памяти, его работу можно возобновить. Выполним в оболочке команду:

    $ sleep 100
    И временно остановим её комбинацией клавиш CTRL + Z .


    Приостановка процесса

    Число в квадратных скобках - это номер задания, который оболочка назначает процессу. Оболочка рассматривает процессы, выполняющиеся в ней, как задания с уникальными номерами. Первому процессу назначается номер 1, второму - 2, и так далее.

    Если вы приостановите задание, привязанное к оболочке, и попытаетесь выйти из неё, bash выдаст предупреждение.

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

    Ps –l


    Список заданий

    В колонке S , выводящей состояние процесса, для приостановленных процессов выводится T . Это указывает на то, что команда либо приостановлена, либо находится в состоянии трассировки.

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

    Выглядит её вызов так:

    Kill processID

    Перехват сигналов Для того, чтобы включить в скрипте отслеживание сигналов Linux, используется команда trap . Если скрипт получает сигнал, указанный при вызове этой команды, он обрабатывает его самостоятельно, при этом оболочка такой сигнал обрабатывать не будет.

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

    Рассмотрим пример, в котором показано, как при вызове команды trap задаётся код, который надо выполнить, и список сигналов, разделённых пробелами, которые мы хотим перехватить. В данном случае это всего один сигнал:

    #!/bin/bash trap "echo " Trapped Ctrl-C"" SIGINT echo This is a test script count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 1 count=$(($count + 1)) done
    Команда trap , использованная в этом примере, выводит текстовое сообщение всякий раз, когда она обнаруживает сигнал SIGINT , который можно сгенерировать, нажав Ctrl + C на клавиатуре.


    Перехват сигналов

    Каждый раз, когда вы нажимаете клавиши CTRL + C , скрипт выполняет команду echo , указанную при вызове trace вместо того, чтобы позволить оболочке завершит его работу.

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

    #!/bin/bash trap "echo Goodbye..." EXIT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1)) done


    Перехват сигнала выхода из скрипта

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

    Модификация перехваченных сигналов и отмена перехвата Для модификации перехваченных скриптом сигналов можно выполнить команду trap с новыми параметрами:

    #!/bin/bash trap "echo "Ctrl-C is trapped."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1)) done trap "echo " I modified the trap!"" SIGINT count=1 while [ $count -le 5 ] do echo "Second Loop #$count" sleep 1 count=$(($count + 1)) done


    Модификация перехвата сигналов

    После модификации сигналы будут обрабатываться по-новому.

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

    #!/bin/bash trap "echo "Ctrl-C is trapped."" SIGINT count=1 while [ $count -le 5 ] do echo "Loop #$count" sleep 1 count=$(($count + 1)) done trap -- SIGINT echo "I just removed the trap" count=1 while [ $count -le 5 ] do echo "Second Loop #$count" sleep 1 count=$(($count + 1)) done
    Если скрипт получит сигнал до отмены перехвата, он обработает его так, как задано в действующей команде trap . Запустим скрипт:

    $ ./myscript
    И нажмём CTRL + C на клавиатуре.


    Сигнал, перехваченный до отмены перехвата

    Первое нажатие CTRL + C пришлось на момент исполнения скрипта, когда перехват сигнала был в силе, поэтому скрипт исполнил назначенную сигналу команду echo . После того, как исполнение дошло до команды отмены перехвата, команда CTRL + C сработала обычным образом, завершив работу скрипта.

    Выполнение сценариев командной строки в фоновом режиме Иногда bash-скриптам требуется немало времени для выполнения некоей задачи. При этом вам может понадобиться возможность нормально работать в командной строке, не дожидаясь завершения скрипта. Реализовать это не так уж и сложно.

    Если вы видели список процессов, выводимый командой ps , вы могли заметить процессы, которые выполняются в фоне и не привязаны к терминалу.
    Напишем такой скрипт:

    #!/bin/bash count=1 while [ $count -le 10 ] do sleep 1 count=$(($count + 1)) done
    Запустим его, указав после имени символ амперсанда (&):

    $ ./myscipt &
    Это приведёт к тому, что он будет запущен как фоновый процесс.


    Запуск скрипта в фоновом режиме

    Скрипт будет запущен в фоновом процессе, в терминал выведется его идентификатор, а когда его выполнение завершится, вы увидите сообщение об этом.

    Обратите внимание на то, что хотя скрипт выполняется в фоне, он продолжает использовать терминал для вывода сообщений в STDOUT и STDERR , то есть, выводимый им текст или сообщения об ошибках можно будет увидеть в терминале.


    Список процессов

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

    Что если нужно, чтобы скрипт продолжал работать и после закрытия терминала?

    Выполнение скриптов, не завершающих работу при закрытии терминала Скрипты можно выполнять в фоновых процессах даже после выхода из терминальной сессии. Для этого можно воспользоваться командой nohup . Эта команда позволяет запустить программу, блокируя сигналы SIGHUP , отправляемые процессу. В результате процесс будет исполняться даже при выходе из терминала, в котором он был запущен.

    Применим эту методику при запуске нашего скрипта:

    Nohup ./myscript &
    Вот что будет выведено в терминал.


    Команда nohup

    Команда nohup отвязывает процесс от терминала. Это означает, что процесс потеряет ссылки на STDOUT и STDERR . Для того, чтобы не потерять данные, выводимые скриптом, nohup автоматически перенаправляет сообщения, поступающие в STDOUT и в STDERR , в файл nohup.out .

    Обратите внимание на то, что при запуске нескольких скриптов из одной и той же директории то, что они выводят, попадёт в один файл nohup.out .

    Просмотр заданий Команда jobs позволяет просматривать текущие задания, которые выполняются в оболочке. Напишем такой скрипт:

    #!/bin/bash count=1 while [ $count -le 10 ] do echo "Loop #$count" sleep 10 count=$(($count + 1)) done
    Запустим его:

    $ ./myscript
    И временно остановим комбинацией клавиш CTRL + Z .


    Запуск и приостановка скрипта

    Запустим тот же скрипт в фоновом режиме, при этом перенаправим вывод скрипта в файл так, чтобы он ничего не выводил на экране:

    $ ./myscript > outfile &
    Выполнив теперь команду jobs , мы увидим сведения как о приостановленном скрипте, так и о том, который работает в фоне.


    Получение сведений о скриптах

    Ключ -l при вызове команды jobs указывает на то, что нам нужны сведения об ID процессов.

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

    Запустим скрипт:

    $ ./myscript
    Нажмём CTRL + Z , что временно остановит его выполнение. Выполним следующую команду:

    $ bg


    Команда bg

    Теперь скрипт выполняется в фоновом режиме.

    Если у вас имеется несколько приостановленных заданий, для перезапуска конкретного задания команде bg можно передать его номер.

    Для перезапуска задания в обычном режиме воспользуйтесь командой fg:

    Планирование запуска скриптов Linux предоставляет пару способов запуска bash-скриптов в заданное время. Это команда at и планировщик заданий cron .

    Вызов команды at выглядит так:

    At [-f filename] time
    Эта команда распознаёт множество форматов указания времени.

    • Стандартный, с указанием часов и минут, например - 10:15.
    • С использованием индикаторов AM/PM, до или после полудня, например - 10:15PM.
    • С использованием специальных имён, таких, как now , noon , midnight .
    В дополнение к возможности указания времени запуска задания, команде at можно передать и дату, используя один из поддерживаемых ей форматов.
    • Стандартный формат указания даты, при котором дата записывается по шаблонам MMDDYY , MM/DD/YY , или DD.MM.YY .
    • Текстовое представление даты, например, Jul 4 или Dec 25 , при этом год можно указать, а можно обойтись и без него.
    • Запись вида now + 25 minutes .
    • Запись вида 10:15PM tomorrow .
    • Запись вида 10:15 + 7 days .
    Не будем углубляться в эту тему, рассмотрим простой вариант использования команды:

    $ at -f ./myscript now


    Планирование заданий с использованием команды at

    Ключ -M при вызове at используется для отправки того, что выведет скрипт, по электронной почте, если система соответствующим образом настроена. Если отправка электронного письма невозможна, этот ключ просто подавит вывод.

    Для того чтобы посмотреть список заданий, ожидающих выполнения, можно воспользоваться командой atq:


    Список заданий, ожидающих выполнения Удаление заданий, ожидающих выполнения Удалить задание, ожидающее выполнения, позволяет команда atrm . При её вызове указывают номер задания:

    $ atrm 18


    Удаление задания Запуск скриптов по расписанию Планирование однократного запуска скриптов с использованием команды at способно облегчить жизнь во многих ситуациях. Но как быть, если нужно, чтобы скрипт выполнялся в одно и то же время ежедневно, или раз в неделю, или раз в месяц?

    В Linux имеется утилита crontab , позволяющая планировать запуск скриптов, которые нужно выполнять регулярно.

    Crontab выполняется в фоне и, основываясь на данных в так называемых cron-таблицах, запускает задания по расписанию.

    Для того, чтобы просмотреть существующую таблицу заданий cron , воспользуйтесь такой командой:

    $ crontab –l
    При планировании запуска скрипта по расписанию crontab принимает данные о том, когда нужно выполнить задание, в таком формате:

    Минута, час, день месяца, месяц, день недели.
    Например, если надо, чтобы некий скрипт с именем command выполнялся ежедневно в 10:30, этому будет соответствовать такая запись в таблице заданий:

    30 10 * * * command
    Здесь универсальный символ « * », использованный для полей, задающих день месяца, месяц и день недели, указывает на то, что cron должен выполнять команду каждый день каждого месяца в 10:30.

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

    30 16 * * 1 command
    Нумерация дней недели начинается с 0, 0 означает воскресенье, 6 - субботу. Вот ещё один пример. Здесь команда будет выполняться в 12 часов дня в первый день каждого месяца.

    00 12 1 * * command
    Нумерация месяцев начинается с 1.
    Для того чтобы добавить запись в таблицу, нужно вызвать crontab с ключом -e:

    Crontab –e
    Затем можно вводить команды формирования расписания:

    30 10 * * * /home/likegeeks/Desktop/myscript
    Благодаря этой команде скрипт будет вызываться ежедневно в 10:30. Если вы столкнётесь с ошибкой «Resource temporarily unavailable», выполните нижеприведённую команду с правами root-пользователя:

    $ rm -f /var/run/crond.pid
    Организовать периодический запуск скриптов с использованием cron можно ещё проще, воспользовавшись несколькими специальными директориями:

    /etc/cron.hourly /etc/cron.daily /etc/cron.weekly /etc/cron.monthly
    Если поместить файл скрипта в одну из них, это приведёт, соответственно, к его ежечасному, ежедневному, еженедельному или ежемесячному запуску.

    Запуск скриптов при входе в систему и при запуске оболочки Автоматизировать запуск скриптов можно, опираясь на различные события, такие, как вход пользователя в систему или запуск оболочки. можно почитать о файлах, которые обрабатываются в подобных ситуациях. Например, это следующие файлы:

    $HOME/.bash_profile $HOME/.bash_login $HOME/.profile
    Для того, чтобы запускать скрипт при входе в систему, поместите его вызов в файл.bash_profile .

    А как насчёт запуска скриптов при открытии терминала? Организовать это поможет файл.bashrc .

    Итоги Сегодня мы разобрали вопросы, касающиеся управления жизненным циклом сценариев, поговорили о том, как запускать скрипты в фоне, как планировать их выполнение по расписанию. В следующий раз читайте о функциях в bash-скриптах и о разработке библиотек.

    Уважаемые читатели! А вы пользуетесь средствами планирования запуска сценариев командной строки по расписанию? Если да - расскажите пожалуйста о них.

    Запустить скрипт на локальном (например, на домашнем) компьютере – весьма просто. А вот как это сделать на удаленном компьютере, т.е. на сервере?

    Запуск программы, написанной на языке С, на сервере, можно выполнить либо из консоли (по протоколу SSH), либо путем вызова выполнения системной команды (например, из PHP).

    Понятно, что в автоматическом режиме его можно запустить, используя автоматический планировщик Cron. А вот как быть, если требуется запустить вручную (например, для окончательной отладки программы)? Об этом пойдет речь в нашей статье. Статья написана, скорее, для новичков.

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

    Подавляющее большинство серверных (т.е. таких, которые выполняются на стороне сервера) скриптов пишут, например, на PHP, на Perl (ну, и плюс та или иная СУБД, если, конечно, в ней есть необходимость). РНР используется, если скрипты выполняют относительно небольшой объем работы, т.е. их целесообразно использовать там, где производительность (быстродействие) не является критичным. По сути, имея синтаксис и особенности, во многом сходные с языком С (Си), PHP во многом напоминает не что иное, как VBA от Microsoft. Практически та же самая идеология и, соответственно, примерно аналогичное быстродействие. На наш взгляд, PHP может применяться в основном для создания вспомогательных, не слишком часто запускаемых скриптов, которые, в идеале, запускаются не при первой загрузке страницы сайта. Например, для организации интерфейса, передачи данных с открытой страницы на сервер, ну, или т.п.

    Скрипты на Perl обладают более высоким быстродействием, но, в отличие от РНР, Perl заметно сложнее, его код менее читаем. Правда, и возможностей у него побольше, чем у PHP. Однако, если требуется быстрая загрузка сайта (а кто сомневается в актуальности этого), быстрое выполнение скриптов (например, производящие сложные математические вычисления, применяемые, в том числе, в онлайновых играх), то целесообразнее написать их на более производительном языке, например, на С (или С++), но не спутайте его с С#, который и по идеологии, и по быстродействию недалеко ушел от VBA. Да, на С++ (чистый С еще быстрее), а то и на Ассемблере.

    Кому-то может показаться, что написание серверных скриптов на С является анахронизмом. Однако, это не так. На самом деле, язык С дает примерно те же возможности, да и синтаксис, в целом, схож с РНР. Правда, серверные скрипты, написанные на С, являются, конечно, более объемными по сравнению с теми, что выполнены на РНР. Потом, в С можно столкнуться с довольно серьезной проблемой, связанной с кириллической кодировкой. В PHP она решается, можно сказать, автоматически, а в С – придется все программировать вручную. Но, повторимся, выигрыш в быстродействии – .

    Как запустить на сервере программу, написанную на С (Си)?

    На локальном компьютере эта задача особых проблем, вроде бы, не вызывает. В Windows это делается путем нажатия кнопки Пуск , затем Выполнить (или Пуск – Программы – Выполнить ), и в появившемся окне ввести имя программы. В ряде случаев может понадобиться ввод пути.

    В LINUX же немного по-другому. Например, для запуска программы, имеющей имя program, надо будет открыть консоль (или терминал, как его называют) и написать в командной строке:

    Опять же, если запускается программа, находящаяся не в том каталоге, который открыт в терминале (консоли), необходимо либо ввести путь к программе, либо в терминале перейти в тот каталог, где она находится.

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

    Итак, на локальном компьютере все просто. А вот как это сделать на сервере?

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

    Однако, просто так запустить программу на сервере не получится. Скажем, нажатие клавишей Enter или двойной щелчок мыши, скорее всего, вызовет попытку открыть ее код.

    Чтобы запустить программу на сервере вручную, необходим или соответствующий клиент, который позволит это сделать или, что проще, консольный доступ на сервер.

    Вы, наверное, слышали про доступ на серверы на основе таких протоколов прикладного уровня, как http , https , ftp ? Как правило, клиенты, работающие на этих протоколах, не позволяют производить запуск программ вручную. Поэтому для реализации консольного доступа необходимо использование, например, протокола Telnet или, гораздо более безопасного и современного протокола – SSH версии 2. Это – также протоколы прикладного уровня.

    Далее все зависит от того, в какой операционной системе работает сервер (хостинг), на котором Вы планируете запускать программу. Как правило, на серверах работает LINUX, например, Debian. Windows гораздо менее популярен. Понятно, что Ваша программа, которую Вы скопировали на сервер и хотите запустить, должна корректно запускаться в операционной системе сервера. Т.е. если, скажем, там установлен LINUX, то и программа должна быть написана и скомпилирована в Линуксе.

    Затем, имеет большое значение, в какой операционной системе работает Ваш (домашний) компьютер.

    Если он работает в Windows, в этом случае можно воспользоваться утилитой telnet от Microsoft. Она, к сожалению, не соответствует современным требованиям безопасности (в частности, аутенификационные данные – пароль – передаются в открытом виде). Поэтому целесообразно использовать соответствующий клиент для того, чтобы :

    Возможно использование SSH-клиента PuTTy. Перейдя по указанной ссылке, Вы можете ознакомиться с подробным описанием технологии консольного подключения, т.е. по протоколу SSH. Клиент необходим для того, чтобы, в частности, эмулировать LUNUX на Вашем компьютере.

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

    Ssh [email protected]

    U123456789 - логин учётной записи хостинга
    123.123.123.123 - IP-адрес сервера

    Далее, если параметры введены правильно, система запросит пароль и, после корректного его ввода и проверки системой Вы попадете в консоль НА СЕРВЕР. И, в общем-то, можете делать там все, что потребуется. Ну, в рамках Ваших прав доступа, конечно.

    Заметим, что примерно такая же методология может быть использована, скажем, чтобы в режиме удаленного доступа попасть не только на сервер, но и на (частный) компьютер какого-нибудь пользователя - такого же, как Вы. Правда, для этого необходимо знать пароль (который некоторые установить забывают). Но, даже если и неизвестен пароль, возможен доступ в так называемые общие (share) папки. Поэтому некоторые пользователи компьютеров, если они используются для выхода в интернет, иногда вообще отключают эти общие папки или, что проще, останавливают службу server , которая по умолчанию, после установки Windows, является работающей.

    Например, чтобы попасть в коренной каталог (на примере нашего сайта), нужно будет набрать команду

    Cd ~/www/сайт/

    Вам нужно будет указать, соответственно, адрес своего сайта.

    Cd пробел имя каталога

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

    ./program

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

    При этом хочется обратить Ваше внимание на некоторые, для новичков неочевидные, вещи. Иногда требуется запустить программу в фоновом режиме, т.е. чтобы ее выполнение не мешало другим программам, в том числе и самой оболочке (например, bash). Когда это актуально?

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

    Поэтому программу подобного рода целесообразнее запустить (при ручном запуске) в фоновом режиме, что делается путем добавления символа &:

    ./program &

    Однако, это может повлечь за собой новую проблему. Дело в том, что, работая в фоновом режиме, программа никак себя не проявит (до тех пор, пока не произойдет событие, которого она ожидает). Поэтому, естественно, продолжит выполняться (точнее, ожидать событие) и после того, как Вы прекратите сеанс взаимодействия (связи) с сервером.

    Вот с домашним компьютером – все проще: выключили его или начали перезагружать – и все, оперативная память чистая, все программы, даже зависшие и те, что работали в фоновом режиме, прекращают выполняться. А ведь здесь мы имеем дело – с СЕРВЕРОМ. Который выключается весьма редко (а если это будет часто, люди не станут размещать там свои сайты). Поэтому… Ваша программа, не будучи выгруженной, так и будет оставаться в оперативной памяти сервера. Во-первых, создавая ему бесполезную нагрузку.


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

    Для сервера, работающего в LINUX, для этой цели может быть использована команда

    Она выведет перечень всех процессов, запущенных Вами в системе (с учетом самой оболочки bash и служба аутенификации, конечно же). И, что немаловажно, укажет индентификаторы каждой из запущенных программ (столбец с заголовком PID).

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

  • ps - выводить список запущенных процессов
  • jobs - альтернативный путь для просмотра процессов запущенных Вами
  • ls – просмотр текущего каталога
  • bg - ставит выполнение процесса в фоновый режим
  • fg - выводит выполнение процесса из фонового режима
  • kill - отправляет сигнал на один или несколько процессов (в основном, чтобы "убить" их)
  • Вот, к примеру, результат, который выводит команда ps :

    PID TTY TIME CMD
    7318 pts/2 00:00:00 bash
    20543 pts/2 00:00:00 ps
    28314 pts/2 00:00:00 bash
    28315 pts/2 00:00:00 logger

    Кстати, команда kill имеет опции, выражаемые целым числом. Среди них имеют значение 1, 2, 15, 9. Последняя – вызывает принудительное, наиболее сильное (или грубое) завершение программы, причем игнорировать его она не сможет. Так, если Вы наберете

    Kill -9 28314

    то должна выгрузиться оболочка bash (правда, скорее всего, она будет тут же автоматически загружена вновь, но уже с другим идентификатором).

    Загрузим имеющуюся на сервере программу, написанную нами на С. Например, это будет program. Так как она предназначена для прослушивания определенного логического порта (под номером, к примеру, 5425, с использованием технологии сокетов), то, пока на этот порт не придет сообщение, она ничего выполнять не будет, просто находясь в состоянии ошижидания. Поэтому загрузим ее в фоновом режиме, чтобы она не мешала работать с оболочкой дальше. При этом:

    Bash-4.1$ ./program & 21015

    Видим, что программе присвоен идентификатор со значением 21015.

    Набираем ps, и вот что видим:

    PID TTY TIME CMD
    10292 pts/2 00:00:00 bash
    10293 pts/2 00:00:00 logger
    21015 pts/2 00:00:00 program
    21016 pts/2 00:00:00 bash
    21017 pts/2 00:00:00 logger
    21022 pts/2 00:00:00 ps
    28478 pts/2 00:00:00 bash

    Так и есть, в третьей строчке находится наша программа с тем самым идентификатором.

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

    ./program

    Система тут же сообщит:

    Bind: Address already in use

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

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

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

    Так как порт под номером 5425 занят, то, соответственно, команда bind во второй раз сработать не может, вызывая указанную ошибку.

    Так вот, кстати, если теперь прекратить сеанс работы, то program останется загруженной в оперативную память сервера. А если еще ее спроектировать так, чтобы она каждый раз генерировала все новые и новые значения портов – то в итоге можно запустить сколько угодно копий указанной программы… и потом получить замечание от хостера. Что нам, конечно, совсем ни к чему.

    Поэтому – выгрузим программу из оперативной памяти:

    Kill 21015

    Система даст сообщение:

    Killed ./program

    Проверка при помощи команды ps показывает, что все, процесса с названием программ больше нет:

    PID TTY TIME CMD
    2382 pts/2 00:00:00 bash
    2383 pts/2 00:00:00 logger
    5848 pts/2 00:00:00 ps
    28478 pts/2 00:00:00 bash

    Но, может статься, что порт (под номером 5425) все же не освободится. Вообще, при передаче данных на основе сокетов (используется протокол TCP) система резервирует порт даже в случае, если программа прекратила выполняться. Это делается для того, чтобы при неожиданных обрывах связи (что может создавать - для компьютера, который посылает сообщения нашей программе - видимость прекращения ее выполнения) сохранить на некоторое время работоспособным используемый порт – в расчете, если связь восстановится и/или программа опять заработает. Т.е. таким образом, предусмотрена как бы подстраховка от некорректного завершения работы программы.

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

    Это означает, что вновь, до момента освобождения порта, программа может не заработать – порт-то занят.

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

    Netstat -tnlp | grep 5425

    Вот что сообщит система:

    Tcp 0 0 0.0.0.0:5425 0.0.0.0:* LISTEN 21015/./program

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

    Для очистки порта (т.е. для удаления его из системы) можно набрать

    Kill -9 21015

    Произойдет «жесткое» удаление программы из оперативной памяти, в том числе и всех созданных ею объектов, т.е. логических портов.

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

    Сеанс должен закрыться:

    Logout Connection to closed.

    Таким образом, как видите, ручной запуск скрипта на удаленном сервере не представляет особого труда.