Это убийца команд, который можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.
ПРОГРАММА:
ИМЯ
killer - Убийца фоновой работы
СИНТАКСИС
убийца [-h] [-V] [-n] [-d]
ОПИСАНИЕ
убийца это Perl-скрипт, который избавляется от фоновых заданий. Фоновые задания определяются как
процессы, принадлежащие пользователям, которые в данный момент не вошли в систему. Работа может быть
работать в фоновом режиме (и исключены из убийцадействия), если их планирование
приоритет был снижен за счет увеличения их хороший(1) значение или если они запущены
через кондор. Подробнее см. ПАКЕТ main раздел этого документа.
В следующих разделах описывается Perl(1) пакеты, составляющие программу-убийцу. я
не ожидайте, что версия, которая работает для меня, будет работать для всех. Я думаю, что
Пакеты ProcessTable и Terminals обладают достаточной гибкостью, поэтому большинство модификаций могут
делаться в основном пакете.
Параметры командной строки
-h Подскажите, как получить помощь
-V Показать номер версии
-n Не убивать, просто напечатать что бы убили
-d Включить вывод отладки
ПАКЕТ Таблица процессов
Каждый объект ProcessTable содержит хэши (или ассоциативные массивы), отображающие различные аспекты
задания в идентификатор процесса (PID). Предоставляются следующие хеши:
pid2user Имя входа, связанное с эффективным UID, под которым выполняется процесс.
pid2ruser Имя входа ассоциируется с реальным UID, под которым выполняется процесс.
pid2uid Эффективный UID, под которым выполняется процесс.
pid2ruid Настоящий UID, от имени которого запущен процесс.
pid2tty Терминал, связанный с процессом.
pid2ppid Родительский процесс процесса
pid2nice хороший(1) ценность процесса.
pid2comm Имя команды процесса.
Кроме того, хэш% Остающийсяпрокс предоставляет список процессов, которые будут убиты.
Предполагаемое использование этого пакета требует чтениеПроцесстаблицы быть призванным заполнить все
хеши, определенные выше. Затем удаляются процессы, отвечающие определенным требованиям.
из хэша% RemixProcs. Те, что не удалены, считаются фоном.
процессы и могут быть убиты.
новый
Эта функция создает новый Таблица процессов объект.
Пример:
мой $ ptable = new ProcessTable;
инициализировать
Эта функция (повторно) инициализирует массивы и любые переменные среды для внешних команд.
Обычно его не нужно вызывать, так как он вызывается новый ().
Пример:
# Очистить таблицу процессов для повторного использования
$ ptable-> initialize ();
чтениеПроцесстаблицы
Эта функция выполняет ps(1) команда для определения запущенных процессов. Примечание
что для этого требуется стиль SYSV ps(1).
Пример:
# Получить список процессов из ОС
$ ptable-> readProcessTable ();
чистая вилкаБомбы
Эта функция ищет большое количество процессов, принадлежащих одному пользователю, и предполагает, что он
кто-то, кто использует вилка () в первый раз. Эффективный способ убрать такую
беспорядок заключается в том, чтобы «убить -STOP» каждый процесс, а затем «убить -KILL» каждый процесс.
Обратите внимание, что эта функция игнорирует такие ошибки root. Если root запускает вилка(2) бомба, это
сценарий не запускается, верно? Также вы должны быть уверены, что количество процессов
упомянутое ниже (490) меньше (равно лучше, не так ли?), чем максимальное число
процессов на пользователя. Также ОС должна иметь ограничение на процесс не менее пары сотен.
выше любого человека. В противном случае вам придется использовать выключатель питания, чтобы избавиться от
вилок бомб.
Каждый раз, когда процессу отправляется сигнал, он регистрируется через системный журнал(3С).
Пример:
# Избавьтесь от бомб вилки. Следите за тем, кто это сделал, в @idiots.
мои @idiots = $ ptable-> cleanForkBombs ();
getUserProcessIds пользователь
Это возвращает список идентификаторов процессов, в которых логин связан с реальным UID
process соответствует аргументу функции.
Пример:
# Найти все процессы, принадлежащие httpd
мой @webservers = $ ptable-> getUserProcessIds ('httpd');
getUniqueTtys
Эта функция возвращает список используемых терминалов. Обратите внимание, что формат будет таким же
как дано ps(1), в котором, как правило, отсутствует ведущий "/ dev /".
Пример:
# Получить список всех терминалов, к которым привязаны процессы
мой @ttylist = $ ptable-> getUniqueTtys ();
удалитьProcessId ПИД-регулятор
Эта функция удаляет pid из списка процессов, которые нужно убить. То есть избавляется
процесса, который должен быть запущен. Скорее всего, это вызовут только другие
функции в этом пакете.
Пример:
# По какой-то причине я знаю, что PID 1234 должен быть разрешен для запуска
$ ptable->удалитьProcessId(1234);
удалитьПроцессы псфилд psvalue
Эта функция удаляет процессы, обладающие определенными характеристиками. Например, если вы хотите
избавиться от всех процессов, принадлежащих пользователю "lp", или от всех процессов, для которых / dev / console используется
их управляющий терминал, это функция для вас.
psfield может быть любым из следующих
pid Удаляет идентификатор процесса, указанный во втором аргументе.
пользователь Удаляет процессы с эффективным UID, связанным с именем входа, указанным во второй
аргумент.
ruser Удаляет процессы с реальным UID, связанным с именем входа, указанным во второй
аргумент.
uid Удаляет процессы с эффективным UID, указанным во втором аргументе.
ruid Удаляет процессы с реальным UID, указанным во втором аргументе.
tty Удаляет процессы с управляющим терминалом, указанным во втором аргументе. Обратите внимание, что
он НЕ должен начинаться с "/ dev /".
ppid Удаляет потомков процесса с PID, указанным во втором аргументе.
nice Удаляет потомков со значением nice, равным второму аргументу.
comm Удаляет дочерние элементы с именем команды, которое совпадает с именем второго аргумента.
Примеры:
# Разрешить запуск всех процессов imapd
$ ptable-> removeProcesses ('comm', 'imapd');
# Убедитесь, что не убили задания на печать
$ ptable-> removeProcesses ('ruser', 'lp');
удалитьДети ПИД-регулятор
Эта функция удаляет всех потомков данного pid. То есть, если аргумент pid равен 1,
это гарантирует, что ничего не убито.
Пример:
# Убедитесь, что вы не прервали доставку почты (предполагается, что у вас есть
# написано getSendmailPid ()). (Sendmail меняет uid, когда
# местная доставка.)
$ ptable-> removeChildren (getSendmailPid);
удалитьКондорДети
Condor - это система пакетных заданий, которая позволяет переносить задания между машинами (см.
http://www.cs.wisc.edu/condor/). Это гарантирует, что рабочие места кондора останутся в покое.
Пример:
# Будьте вежливы с людьми, которые работают через кондора.
$ ptable-> removeCondorChildren ();
findChildProcs ПИД-регулятор
Эта функция находит и возвращает список всех процессов, которые являются потомками
PID, указанный в первом аргументе.
Пример:
# Найдите процессы, которые являются потомками PID 1234
мой @procs = $ ptable->findChildProcs(1234);
получитьTtys пользователь
Эта функция возвращает список терминалов, которые используются процессами, принадлежащими определенному
пользователь.
Пример:
# найти все терминалы, используемые gerdts.
мой @ttylist = getTtys ('gerdts');
получитьпользователей
Эта функция выводит список всех пользователей, у которых есть активные процессы.
Пример:
# Получить всех пользователей, которые вошли в систему
мои @lusers = $ ptable-> getUsers ()
удалитьNiceJobs
Эта функция удаляет все задания с хорошим значением больше 9. То есть, у них есть
более низкий приоритет планирования, чем значение по умолчанию (0).
Пример:
# Разрешить людям запускать фоновые задания, пока они уступают
# те, у кого есть вакансии "на переднем плане"
$ ptable-> removeNiceJobs ();
процесс печати файловая ручка ПИД-регулятор
Эта функция отображает информацию о процессе, как "ps | grep".
Пример:
# Распечатать информацию об инициализации в STDERR
$ ptable-> printProcess (\ * STDERR, 1);
PrintProcessTable
PrintProcessTable файл-дескриптор
Эта функция выводит информацию обо всех процессах, обнаруженных чтениеПроцесстаблицы, Если
задан аргумент, это должен быть дескриптор файла, в который должен быть напечатан вывод.
Примеры:
# Распечатать таблицу процессов на стандартный вывод
$ ptable-> printProcessTable ();
# Отправьте кому-нибудь таблицу процессов
откройте ПОЧТУ '| / usr / bin / mail something';
$ ptable-> printProcessTable (\ * ПОЧТА);
закрыть (ПОЧТА);
printRemainingProcess
printRemainingProcess файл-дескриптор
Эта функция выводит информацию обо всех процессах, обнаруженных чтениеПроцесстаблицы, Но не
удалено из% оставшихсяпроц. Если указан аргумент, это должен быть дескриптор файла для
который вывод должен быть напечатан.
Примеры:
# Распечатать задания, которые нужно убить, на стандартный вывод
$ ptable-> printRemainingProcesses ();
# Отправьте кому-нибудь задания, которые нужно убить
откройте ПОЧТУ '| / usr / bin / mail something';
$ ptable-> printRemainingProcesses (\ * ПОЧТА);
закрыть (ПОЧТА);
getRemainingProcesses
Возвращает список процессов, которые, вероятно, являются фоновыми заданиями.
Пример:
# Получить список процессов, которые я планирую убить
мой @procsToKill = $ ptable-> getRemainingProcesses ();
убить всех номер сигнала
Посылает указанный сигнал всем перечисленным процессам. Запись в системном журнале делается для каждого
сигнал отправлен.
Пример:
# Посылаем всем остальным процессам сигнал TERM, затем
# KILL сигнал
$ ptable->убить всех(15);
спать(10); # Дайте им шанс очистить
$ ptable->убить всех(9);
ПАКЕТ Разъемы
Пакет "Терминалы" позволяет узнать, как долго различные пользователи находились в
праздный.
новый
Эта функция используется для создания нового объекта Terminals.
Пример:
# Получить новый объект Terminals.
мой $ term = новые терминалы;
инициализировать
Эта функция определяет, кто находится в системе и как долго они не использовались. Это
обычно вызывается только новый ().
Пример:
# Обновить состояние терминалов.
$ term-> инициализировать ();
showConsoleUser
Эта функция возвращает логин человека, который физически сидит за машиной.
Пример:
# Распечатать логин человека на консоли
printf "% s находится на консоли \ n", $ term-> showConsoleUser ();
инициализироватьTty терминал Статистические данные
Это инициализирует внутренние структуры для данного терминала.
getX11IdleTime пользователь
Выясните, как долго пользователь простаивал в X11. Вернуть секунды простоя.
получитьIdleTime пользователь
Выясните, как долго пользователь бездействовал. Это достигается путем проверки всех терминалов.
что пользователь владеет и возвращает количество времени, прошедшее с момента последнего обращения
использовал. Кроме того, если пользователь находится у консоли, возможно, что он / она не
печатает, но довольно активно с помощью мыши или набирает текст в приложении, которое не использует
терминал.
Пример:
# Выясните, как долго пользователь на консоли бездействует
мой $ consoleIdle = $ term-getIdleTime ($ term-> showConsoleUser ());
распечатать все
Печатает в stdout, кто на каком терминале и сколько времени они простаивали. Только полезный
для отладки.
Пример:
# Взгляните на содержимое структур в моем
# Объект терминалов
$ term-> printEverything ();
ПАКЕТ main
Основной пакет - это версия, используемая на рабочих станциях Unix в Университете
Центр автоматизированного проектирования Висонсина (CAE). Я подозреваю, что люди в других местах
чем CAE захочет сделать что-то немного по-другому. Не стесняйтесь воспринимать это как
пример того, как можно эффективно использовать пакеты processTable и Terminals.
Конфигурация кредита
$ forkadmin Адрес электронной почты для уведомления о бомбардировке вилкой
$ killadmin Адрес электронной почты для уведомления об обычных убийствах
$ fromaddr От кого якобы отправляются сообщения электронной почты?
$ упрямыйадмин
Адрес электронной почты для уведомления, когда рабочие места не умрут
@validusers Это те люди, которых вы никогда не должны убивать
$ minuid Не убивать процессы пользователей с uid ниже этого значения.
$ maxidletime
Максимальное количество секунд, в течение которых пользователь может бездействовать, не будучи классифицированным
как имеющие "фоновую" работу.
Если я действительно пытаюсь избежать убийцы фоновых заданий, я, скорее всего, добавлю
обработчик сигнала, который будет ждать сигнала 15. Когда я его увидел, я сделал форк, вызывая
родитель умрет, а ребенок продолжит делать мою работу.
Предполагая, что все думают так же, как я, я полагаю, что мне нужно будет сделать как минимум два
полные проходы, чтобы убрать плохих пользователей. Первый проход относительно хорош (отправляет
сигнал 15, чуть позже - сигнал 9). Хорошо написанная программа займет
сигнал 15 как знак того, что он должен очиститься, а затем выключиться. Когда процесс получает
сигнал 9, ему ничего не остается, кроме как умереть.
Второй проход не такой уж и приятный. Находит все фоновые процессы, посылает им сигнал 23
(SIGSTOP), затем сигнал 9 (SIGKILL). Это в значительной степени (но не абсолютно) гарантирует
эти процессы не могут найти способ обойти убийцу фоновых заданий.
сбор информации
Эта функция собирает информацию из пакетов Terminals и ProcessTable, а затем на основе
на основе этой информации решает, какие задания следует разрешить запускать. В частности, это
следующие:
· Создает экземпляры новых объектов ProcessTable и Terminals. Обратите внимание, что Terminals :: new заполняет
все необходимые структуры, чтобы поймать пользователей, которые вошли в систему между вызовами
собиратьинфо.
· Читает таблицу процессов
· Удаляет процессы condor и задания condor из списка процессов, подлежащих уничтожению.
· Удаляет все задания, принадлежащие всем пользователям в массиве конфигурации @validusers, из
список процессов, которые нужно убить.
· Удаляет все хороший(1) задания из списка заданий, которые нужно убить.
· Удаляет все задания, принадлежащие пользователям, у которых у пользователя время простоя менее $ maxidletime
хотя бы на одном терминале. Кроме того, вакансии, связанные с ttys, принадлежащие
сохраняются пользователи, у которых время простоя менее $ maxidletime хотя бы на одном терминале.
Это делает так, что если luser использует su(1) чтобы получить привилегии пьяницы, процессы
принадлежащий пьянице не будет убит.
· Удаляет все процессы пользователей с uid ниже значения $ minuid.
· Наконец, возвращаются таблица процессов и терминальные объекты.
Используйте убийцу онлайн с помощью сервисов onworks.net
