One place for hosting & domains

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

      Использование ps, kill и nice для управления процессами в Linux


      Введение


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

      Хотя Linux автоматически выполняет все скрытые низкоуровневые задачи жизненного цикла процесса, нам необходим способ взаимодействия с операционной системой для управления на более высоком уровне.

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

      В качестве примера мы используем Ubuntu 12.04 VPS, но любые современные дистрибутивы Linux будут работать аналогичным образом.

      Просмотр запущенных процессов в Linux


      top


      Чтобы посмотреть, какие процессы запущены на вашем сервере, нужно запустить команду top:

      top***
      
      top - 15:14:40 up 46 min,  1 user,  load average: 0.00, 0.01, 0.05 Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st Mem:   1019600k total,   316576k used,   703024k free,     7652k buffers Swap:        0k total,        0k used,        0k free,   258976k cached   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND               1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init                   2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd               3 root      20   0     0    0    0 S  0.0  0.0   0:00.07 ksoftirqd/0            6 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 migration/0            7 root      RT   0     0    0    0 S  0.0  0.0   0:00.03 watchdog/0             8 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 cpuset                 9 root       0 -20     0    0    0 S  0.0  0.0   0:00.00 khelper               10 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kdevtmpfs          
      

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

      Вы можете легко увидеть, что в системе запущен 1 процесс, а 55 процессов находятся в режиме сна (т. е. не активны/не используют ресурсы ЦП).

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

      htop


      В репозиториях доступна улучшенная версия top, которая называется htop. Установите ее с помощью следующей команды:

      sudo apt-get install htop
      

      Если мы запустим команду htop, мы увидим отображение информации в более удобном формате:

      htop***
      
        Mem[|||||||||||           49/995MB]     Load average: 0.00 0.03 0.05   CPU[                          0.0%]     Tasks: 21, 3 thr; 1 running   Swp[                         0/0MB]     Uptime: 00:58:11   PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command  1259 root       20   0 25660  1880  1368 R  0.0  0.2  0:00.06 htop     1 root       20   0 24188  2120  1300 S  0.0  0.2  0:00.56 /sbin/init   311 root       20   0 17224   636   440 S  0.0  0.1  0:00.07 upstart-udev-brid   314 root       20   0 21592  1280   760 S  0.0  0.1  0:00.06 /sbin/udevd --dae   389 messagebu  20   0 23808   688   444 S  0.0  0.1  0:00.01 dbus-daemon --sys   407 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.02 rsyslogd -c5   408 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5   409 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.00 rsyslogd -c5   406 syslog     20   0  243M  1404  1080 S  0.0  0.1  0:00.04 rsyslogd -c5   553 root       20   0 15180   400   204 S  0.0  0.0  0:00.01 upstart-socket-br
      

      Вы можете узнать больше об использовании top и htop здесь.

      Использование ps для вывода перечня процессов


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

      Однако эти инструменты не всегда достаточно гибкие, чтобы охватывать все сценарии. Решить эту проблему может помочь мощная команда ps.

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

      ps***
      
        PID TTY          TIME CMD  1017 pts/0    00:00:00 bash  1262 pts/0    00:00:00 ps
      

      Вывод показывает все процессы, связанные с текущим пользователем и текущим сеансом терминала. Это имеет смысл, потому что мы запускаем на этом терминале только bash и ps.

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

      ps aux***
      
      USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND root         1  0.0  0.2  24188  2120 ?        Ss   14:28   0:00 /sbin/init root         2  0.0  0.0      0     0 ?        S    14:28   0:00 [kthreadd] root         3  0.0  0.0      0     0 ?        S    14:28   0:00 [ksoftirqd/0] root         6  0.0  0.0      0     0 ?        S    14:28   0:00 [migration/0] root         7  0.0  0.0      0     0 ?        S    14:28   0:00 [watchdog/0] root         8  0.0  0.0      0     0 ?        S<   14:28   0:00 [cpuset] root         9  0.0  0.0      0     0 ?        S<   14:28   0:00 [khelper] . . .
      

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

      Чтобы посмотреть представление дерева с иллюстрацией иерархических отношений, данную команду можно запустить с этими опциями:

      ps axjf***
      
       PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND     0     2     0     0 ?           -1 S        0   0:00 [kthreadd]     2     3     0     0 ?           -1 S        0   0:00  _ [ksoftirqd/0]     2     6     0     0 ?           -1 S        0   0:00  _ [migration/0]     2     7     0     0 ?           -1 S        0   0:00  _ [watchdog/0]     2     8     0     0 ?           -1 S<       0   0:00  _ [cpuset]     2     9     0     0 ?           -1 S<       0   0:00  _ [khelper]     2    10     0     0 ?           -1 S        0   0:00  _ [kdevtmpfs]     2    11     0     0 ?           -1 S<       0   0:00  _ [netns] . . .
      

      Как видите, процесс kthreadd отображается как родитель процесса ksoftirqd/0 и других процессов.

      Примечание об идентификаторах процессов


      В системах Linux и Unix каждому процессу назначается идентификатор процесса или PID. Операционная система использует их для идентификации и отслеживания процессов.

      Чтобы быстро узнать PID процесса, вы можете использовать команду pgrep:

      pgrep bash***
      
      1017
      

      Эта команда просто запросит идентификатор процесса и выведет его.

      Процессу init, который создается первым при загрузке, присваивается PID “1”.

      pgrep init***
      
      1
      

      Этот процесс отвечает за создание всех остальных процессов в системе. Последующим процессам присваиваются большие номера PID.

      Родитель процесса — это процесс, который отвечает за его создание. Родительские процессы имеют идентификатор PPID, который можно увидеть в заголовках столбцов многих приложений для управления процессами, включая top, htop и ps.

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

      Отношения родительских и дочерних элементов


      Создание дочернего процесса осуществляется в два этапа: fork() создает новое адресное пространство и копирует в него ресурсы, принадлежащие родительскому процессу, с помощью copy-on-write; а exec() загружает исполняемый блок в адресное пространство и выполняет его.

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

      Отправка сигналов процессам в Linux


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

      Отправка сигналов процессам по PID


      Наиболее распространенный способ передачи сигналов в программу — использовать команду kill.

      Как вы можете догадаться, по умолчанию эта утилита пытается уничтожить процесс:

      <pre>kill <span class=“highlight”>PIDoftarget_process</span></pre>

      Она отправляет процессору сигнал TERM. Сигнал TERM просит процесс остановиться. Это позволяет программе выполнить операции по очистке и нормально завершить работу.

      Если программа работает неправильно и не завершает работу после получения сигнала TERM, мы можем отправить сигнал более высокого уровня — KILL:

      <pre>kill -KILL <span class=“highlight”>PIDoftarget_process</span></pre>

      Это специальный сигнал, который не отправляется программе.

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

      Каждому сигналу присвоено число, которое можно передать вместо имени. Например, вы можете передать “-15” вместо “-TERM” и “-9” вместо “-KILL”.

      Использование сигналов для других целей


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

      Например, многие демоны перезапускаются при получении сигнала HUP или прекращения работы. Например, так работает Apache.

      <pre>sudo kill -HUP <span class=“highlight”>pidofapache</span></pre>

      Получив вышеуказанную команду, Apache перезагрузит файл конфигурации и возобновит вывод контента.

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

      kill -l***
      
      1) SIGHUP    2) SIGINT   3) SIGQUIT  4) SIGILL   5) SIGTRAP  6) SIGABRT  7) SIGBUS   8) SIGFPE   9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM . . .
      

      Отправка сигналов процессам по имени


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

      Команда pkill работает практически точно так же как и kill, но использует имя процесса:

      pkill -9 ping
      

      Вышеуказанная команда эквивалентна команде:

      kill -9 `pgrep ping`
      

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

      killall firefox
      

      Приведенная выше команда отправит сигнал TERM всем экземплярам firefox, запущенным на этом компьютере.

      Настройка приоритетов процессов


      Часто бывает необходимо изменить приоритет процессов в серверной среде.

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

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

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

      Когда мы запускали команду top в начале этого учебного модуля, мы видели столбец “NI”. В этом столбце отображается значение вежливости процесса:

      top***
      
       Tasks:  56 total,   1 running,  55 sleeping,   0 stopped,   0 zombie Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st Mem:   1019600k total,   324496k used,   695104k free,     8512k buffers Swap:        0k total,        0k used,        0k free,   264812k cached   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND            1635 root      20   0 17300 1200  920 R  0.3  0.1   0:00.01 top                    1 root      20   0 24188 2120 1300 S  0.0  0.2   0:00.56 init                   2 root      20   0     0    0    0 S  0.0  0.0   0:00.00 kthreadd               3 root      20   0     0    0    0 S  0.0  0.0   0:00.11 ksoftirqd/0
      

      В зависимости от системы, значения вежливости могут различаться от “-19/-20” (наибольший приоритет) до “19/20” (наименьший приоритет).

      Чтобы запустить программу с определенным значением вежливости, мы можем использовать команду nice:

      <pre>nice -n 15 <span class=“highlight”>commandtoexecute</span></pre>

      Это работает только в начале новой программы.

      Чтобы изменить значение вежливости уже выполняемой программы, мы используем инструмент renice:

      <pre>renice 0 <span class=“highlight”>PIDtoprioritize</span></pre>

      Примечание. Хотя nice по необходимости использует имя команды, renice вызывает PID процесса.

      Заключение


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

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

      <div class=“author”>Джастин Эллингвуд</div>



      Source link

      Использование выражений Break, Continue и Pass при работе с циклами в Python 3


      Введение

      Использование циклов for и циклов while в Python помогает эффективно автоматизировать и воспроизводить задачи.

      Однако иногда на работу вашей программы может влиять внешний фактор. Когда это произойдет, вы можете захотеть, чтобы ваша программа полностью вышла из цикла, пропустила часть цикла и продолжила его выполнение или игнорировала этот внешний фактор. Для этих действий используются выражения break, continue и pass.

      Выражение Break

      В Python выражение break дает вам возможность выйти из цикла при активации внешнего условия. Выражение break помещается в блок кода внутри выражения loop, обычно после условного выражения if.

      Рассмотрим пример использования выражения break в цикле for:

      number = 0
      
      for number in range(10):
          if number == 5:
              break    # break here
      
          print('Number is ' + str(number))
      
      print('Out of loop')
      
      

      В этой небольшой программе переменная number инициализируется как 0. Затем выражение for строит цикл, пока значение переменной number составляет меньше 10.

      В цикле for имеется выражение if, которое задает условие, что если значение переменной number равно целому числу 5, то цикл прекращается.

      В цикле также содержится выражение print(), которое выполняется с каждой итерацией цикла for, пока цикл не прекращается, поскольку оно располагается после выражения break.

      Чтобы узнавать о выходе из цикла, мы добавили завершающее выражение print() вне цикла for.

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

      Output

      Number is 0 Number is 1 Number is 2 Number is 3 Number is 4 Out of loop

      Это показывает, что когда переменная number оценивается как эквивалентная целому числу 5, цикл прекращается, поскольку программа получает соответствующее указание через выражение break.

      Выражение break заставляет программу выйти из цикла.

      Выражение Continue

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

      Выражение continue размещается в блоке кода под выражением цикла, обычно после условного выражения if.

      Мы используем ту же программу с циклом for, что и в разделе «Выражение Break» выше, но при этом используем выражение continue вместо выражения break:

      number = 0
      
      for number in range(10):
          if number == 5:
              continue    # continue here
      
          print('Number is ' + str(number))
      
      print('Out of loop')
      
      

      Отличие выражения continue от выражения break заключается в том, что код продолжит выполняться несмотря на прерывание, если значение переменной number будет оценено как равное 5. Давайте посмотрим на результаты:

      Output

      Number is 0 Number is 1 Number is 2 Number is 3 Number is 4 Number is 6 Number is 7 Number is 8 Number is 9 Out of loop

      В этом выводе условие Number is 5 никогда не выполняется, но цикл продолжается после этого, чтобы выводить линии для чисел 6–10 до выхода из цикла.

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

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

      Выражение Pass

      При активации внешнего условия выражение pass позволяет обрабатывать условия без влияния на цикл; чтение кода будет продолжаться до появления выражения break или другого выражения.

      Как и в случае с другими выражениями, выражение pass будет содержаться в блоке кода до выражения loop, обычно после условного выражения if.

      Используя тот же код выше, попробуйте заменить выражение break или continue выражением pass:

      number = 0
      
      for number in range(10):
          if number == 5:
              pass    # pass here
      
          print('Number is ' + str(number))
      
      print('Out of loop')
      
      

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

      Мы запустим программу и оценим вывод:

      Output

      Number is 0 Number is 1 Number is 2 Number is 3 Number is 4 Number is 5 Number is 6 Number is 7 Number is 8 Number is 9 Out of loop

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

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

      Заключение

      Выражения break, continue и pass в Python позволяют использовать циклы for и while в вашем коде более эффективно.

      Чтобы больше поработать с выражениями break и pass, вы можете выполнить учебный модуль нашего проекта «Создание бота Twitterbot с помощью Python 3 и библиотеки Tweepy».



      Source link

      Использование сервера SMTP Google


      Автор выбрал COVID-19 Relief Fund для получения пожертвования в рамках программы Write for DOnations.

      Введение

      Портативный сервер Google SMTP — один из малоизвестных функциональных компонентов Gmail и Google Apps. Вместо того, чтобы управлять собственным сервером исходящей почты в дроплете DigitalOcean или кластере Kubernetes, вы можете настроить сервер Google SMTP для работы с любым скриптом или с любой программой, которые вы хотите использовать для отправки электронной почты. Для этого потребуется (i) бесплатная учетная запись Gmail или (ii) платная учетная запись G Suite.

      Преимущества

      Вы можете использовать службу Google для сохранения и индексации электронных писем, отправляемых через сервер SMTP, чтобы резервные копии всех отправленных электронных писем хранились на серверах Google, и чтобы в них можно было производить поиск. Если вы решите использовать учетную запись Gmail или G Suite и для получения входящей почты, вся ваша почта будет храниться в одном удобном месте. Кроме того, поскольку сервер Google SMTP не использует порт 25, это уменьшит вероятность того, что провайдер заблокирует ваше электронное письмо или пометит его как спам.

      Настройки

      Для сервера Google SMTP требуется аутентификация, и здесь мы покажем, как настроить ее в почтовом клиенте или приложении:

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

      1. Сервер SMTP (т. е. сервер исходящей почты): smtp.gmail.com
      2. Имя пользователя SMTP: ваш полный адрес электронной почты Gmail или G Suite (например, example@gmail.com или example@your_domain)
      3. Пароль SMTP: ваш пароль Gmail или G Suite
      4. Порт SMTP: 465
      5. Требуется SMTP TLS/SSL: да

      Чтобы отправленные электронные письма автоматически копировались Google в папку Отправленные, необходимо также убедиться, что для вашей учетной записи включен доступ IMAP.

      Для этого следует перейти в настройки Gmail и открыть вкладку Переадресация и POP/IMAP. Затем следует перейти в раздел Доступ IMAP и убедиться, что доступ IMAP включен для вашей учетной записи.

      Примечание. Google будет автоматически перезаписывать строку От любого электронного письма, отправляемого через сервер SMTP Google, на связанный с учетной записью электронный адрес по умолчанию, если используемый адрес не содержится в списке адресов Отправлять почту как в настройках Gmail или G Suite. Чтобы просмотреть этот список, используйте вкладку Учетные записи и импорт на экране настроек.

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

      Лимиты отправки

      Google ограничивает объем почты, который пользователь может отправить через портативный сервер SMTP. Этот лимит ограничивает количество отправляемых сообщений в день 99 электронными сообщениями. Это ограничение автоматически снимается через 24 часа после достижения предела.

      Заключение

      Теперь у вас есть возможность использовать сервер Google SMTP. Если компактной версии недостаточно, вы можете установить и использовать postfix как сервер SMTP, служащий только для отправки сообщений.



      Source link