$ сон 100 &[1] 9298
использовать
пидофВы можете просмотреть идентификатор процесса указанного имени программы:
$ pidof Sleep9298
$ cat /proc/9298/maps08048000-0804b000 r-xp 00000000 08:01 977399 /bin/sleep0804b000-0804c000 rw -p 00003000 08:01 977399 /bin/sleep0804c000-0806d000 rw-p 0804c000 00:00 0 [куча]b7c8b000-b7cca000 r--p 00000000 08:01 443354...bfbd8000-bfbed000 rw-p bfbd8000 00:00 0 [стек]ffffe000-fffff000 r-xp 00000000 00:00 0 [vdso]
После выполнения программы она загружается в память и становится процессом. Выше показан образ памяти (виртуальная память) процесса, включая инструкции программы, данные и некоторое пространство стека, используемое для хранения параметров командной строки программы и переменных среды. Пространство кучи, используемое для приложения с динамической памятью, было выделено.
Подробную информацию о процессе выполнения программы в командной строке см. в разделе «Момент выполнения программы в командной строке Linux».
На самом деле есть и другие способы создать процесс, то есть дать возможность программе работать. Например, с помощью некоторых настроек можно автоматически запускать программу при старте системы (подробнее см.
человек инициализирует) или настроив
кронд(или
в), чтобы программа запускалась регулярно. Кроме того, есть еще один способ: написать сценарий Shell и записать программу в файл сценария. Когда файл сценария будет выполнен, программа в файле будет выполнена и станет процессом. Детали этих методов вдаваться не будут. Давайте научимся просматривать свойства процесса.
Необходимо добавить одну вещь: чтобы выполнить программу из командной строки, вы можете передать
ulimitВстроенные команды используются для установки ресурсов, которые может использовать процесс, таких как максимальное количество файловых дескрипторов, которые процесс может открыть, максимальное пространство стека, пространство виртуальной памяти и т. д. Для конкретного использования см.
helpulimit.
может пройти
ПСИспользуйте команду для просмотра атрибутов и статуса процесса. Эта информация включает пользователя, которому принадлежит процесс, программу, соответствующую процессу, и имя пользователя.
Процессориспользование памяти и другая информация. Знание того, как их просматривать, может помочь в соответствующем статистическом анализе и других операциях.
Просмотрите свойства всех текущих процессов в системе:
$ пс -эф
Просмотр процесса, соответствующего программе, содержащей определенный символ в команде, процессе
ИДЕНТИФИКАТОРэто 1.
телетайпдля? Указывает, что это не связано с терминалом:
$ ps -C инициализация PID TTY TIME CMD 1 00:00:01 инициализация
Выберите процессы, запущенные конкретным пользователем:
$ ps -U сокол
Выведите указанное содержимое в соответствии с указанным форматом. Следующее выводит имя команды и.
ПроцессорСкорость использования:
$ ps -e -o %C %c
Распечатать
ПроцессорТоп-4 наиболее часто используемых программ:
$ ps -e -o %C %c | sort -u -k1 -r | head -5 7.5 Firefox-bin 1.1 Xorg 0.8 scim-panel-gtk 0.2 scim-bridge
Получите пять процессов, использующих самую большую виртуальную память:
$ ps -e -o %z %c | sort -n -k1 -r | head -5349588 firefox-bin 96612 xfce4-terminal 88840 xfdesktop 76332 gedit 58920 scim-panel-gtk
Между всеми процессами в системе существует «родственная» связь, которую можно
пстриПосмотрите на эти отношения:
$ pstree
Дерево вызовов системных процессов будет напечатано выше, и вы сможете ясно увидеть взаимосвязь вызовов между всеми активными процессами в текущей системе.
$ топ
Самая большая особенность этой команды заключается в том, что она может динамически просматривать информацию о процессе. Конечно, она также предоставляет некоторые другие параметры, такие как.
-СВы можете отсортировать и просмотреть его по совокупному времени выполнения или использовать
-уПросмотр процессов, запущенных указанным пользователем и т. д.
Пополнить:
вершинаКоманда поддерживает интерактивность, например, она поддерживает
тыКоманда отображает все процессы пользователя и поддерживает передачу
кКоманда для завершения процесса при использовании;
-n 1опция включения режима пакетной обработки, конкретное использование:
$ топ -n 1 -b
Давайте обсудим интересную проблему: как заставить одновременно работать только одну программу.
Это означает, что пока программа выполняется, ее нельзя запустить снова. Так что же делать?
Если одна и та же программа скопирована во множество копий и имеет разные имена файлов и размещена в разных местах, то это будет хуже, поэтому рассмотрим самый простой случай, то есть эта программа уникальна во всей системе, и имя тоже уникально. . Как в этом случае можно ответить на приведенные выше вопросы?
Общий механизм таков: в начале программы проверьте, была ли она выполнена, остановитесь, в противном случае продолжите выполнение последующего кода.
Стратегии разнообразны. Поскольку предыдущее предположение обеспечило уникальность имени файла программы и кода, так и до конца.
ПСКоманда находит имена программ, соответствующие всем текущим процессам, и сравнивает их поочередно с именем собственной программы. Если она уже существует, значит, она уже запускалась.
ps -e -o %c | tr -d | grep -q ^init$ #Проверить, выполняется ли текущая программа [ $? -eq 0 ] && exit #Если да, то выйти, $? было выполнено успешно
При каждом запуске сначала проверяйте, существует ли процесс, сохраняющий себя в указанном месте.
ИДЕНТИФИКАТОРфайл, если он не существует, то продолжить выполнение, если он существует, то просмотреть процесс
ИДЕНТИФИКАТОРЕсли да, то выйдите, иначе перезапишите новый процесс в файл.
ИДЕНТИФИКАТОР, и продолжаем.
pidfile=/tmp/$0.pidif [ -f $pidfile ]; then OLDPID=$(cat $pidfile) ps -e -o %p | grep -q ^$OLDPID$ [ $? && exitfiecho $$ > $pidfile#... Тело кода# Установите действие сигнала 0. При выходе из программы срабатывает сигнал для удаления ловушки временного файла rm $pidfile 0
Не стесняйтесь использовать больше стратегий реализации самостоятельно!
Помимо обеспечения бесперебойного выполнения каждого процесса, чтобы разрешить выполнение определенных задач в первую очередь, система будет использовать определенные методы планирования при планировании процессов, такие как общий алгоритм планирования ротации временных интервалов в соответствии с приоритетом. В этом случае вы можете пройти
РеницеНастройте приоритет работающей программы, например: `
$ ps -e -o %p %c %n grep xfs 5089 xfs 0
$ renice 1 -p 5089renice: 5089: setpriority: Операция не разрешена$ sudo renice 1 -p 5089 #Требуются разрешения [sudo] пароль для falcon:5089: старый приоритет 0, новый приоритет 1$ ps -e -o %p % c %n | grep xfs #Посмотрите еще раз, приоритет изменен 5089 xfs 1
Поскольку вы можете выполнить программу и создать процесс через командную строку, существует также способ завершить ее. может пройти
убийствоКоманда посылает сигнал запущенному пользователем процессу о завершении процесса. Разумеется, она «универсальная».
кореньпочти
убийствоВсе процессы (кроме
инициализироватьснаружи). Например,
$ Sleep 50 & #Запустить процесс [1] 11347$ kill 11347
убийствоПо умолчанию команда отправит сигнал завершения (
СИГТЕРМ) в программу и позвольте программе выйти, но
убийствоДругие сигналы также могут быть отправлены, и их можно определить с помощью
человек 7 сигналВы также можете просмотреть его через
убить -лПеречислите это.
$ man 7 signal$ 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) SIGUSR213) SIGPIPE 14) SIGALRM 15 ) СИГТЕРМ 16) SIGSTKFLT17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+439) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) СИГРТМИН+10 45) SIGRTMIN+11 46) SIGRTMIN+1247) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-1451) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-1055) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-659) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX
Например, используйте
убийствокоманда для отправки
СИГСТОППодайте сигнал программе на паузу, а затем отправьте
СИГКОНТСигнал поддерживает его работу.
$ Sleep 50 &[1] 11441$ jobs[1]+ Запуск сна 50 &$ kill -s SIGSTOP 11441 #Это эквивалентно выполнению операции CTRL+Z над процессом переднего плана $ jobs[1]+ Остановка сна 50$ kill - s SIGCONT 11441 #Это эквивалентно предыдущей операции bg %1, которую мы использовали для запуска фонового процесса $ jobs[1]+ Запуск сна 50 &$ kill %1 #В текущем сеансе вы также можете управлять процессом через номер задания $ jobs[1]+ Прерванный сон 50
видимый
убийствоКоманда предоставляет очень хорошие функции, но она может быть основана только на процессе
ИДЕНТИФИКАТОРили задание контролировать процесс, в то время как
убийствои
убить всехПредоставляются дополнительные параметры, которые расширяют возможности управления процессом по имени его программы или даже по имени пользователя. Пожалуйста, обратитесь к их руководствам для более подробной информации по использованию.
Когда программа завершает работу, как определить, завершилась ли программа нормально или ненормально? Все еще помните эту классику Linux?
Привет, мирПрограмма? В конце кода всегда есть строка
вернуть 0заявление. этот
вернуть 0Фактически это позволяет программисту проверить, нормально ли завершается процесс. Если процесс возвращает другое значение, то можно с уверенностью сказать, что процесс завершился ненормально, поскольку он еще не был выполнен.
вернуть 0Это утверждение выходит.
Так как же проверить статус завершения процесса, то есть возвращаемое значение?
существовать
Оболочка, вы можете проверить эту специальную переменную
$?, в котором сохраняется статус выхода после выполнения предыдущей команды.
$ test1bash: test1: команда не найдена$ echo $?127$ cat ./test.c | grep hello$ echo $?1$ cat ./test.c | grep hi printf(привет, я!n);$ echo $?0
Похоже, возврат 0 стал негласным правилом, хотя не существует стандарта, четко оговаривающего это, когда программа возвращается нормально, ее всегда можно вернуть.
$?0 обнаруживается в , но при отклонении от нормы всегда обнаруживается значение, отличное от 0. Это говорит нам о том, что в конце программы лучше всего следовать
выход 0чтобы каждый мог пройти тест
$?Определите, нормально ли завершается программа. Если однажды кто-то случайно воспользуется вашей программой и попытается проверить ее статус завершения, но вы необъяснимым образом вернете
-1Или 1, тогда он будет очень огорчен и будет задаваться вопросом, где проблема в программе, которую он сам написал. Он будет долго проверять ее, но растеряться, потому что настолько доверяет вам, что никогда не усомнится в ваших навыках программирования. начало и конец. Все будет по-другому!
Чтобы облегчить проектирование и реализацию, большая задача обычно разбивается на более мелкие модули. Различные модули после запуска становятся процессами. Как они взаимодействуют друг с другом для обмена данными и совместной работы? Многие методы упоминаются в книге «Продвинутое программирование в среде UNIX», например, каналы (безымянные и именованные каналы), сигналы (
сигнал), сообщение (
Сообщение) очередь (очередь сообщений), разделяемая память (
ммап/мунмап), семафор (
семафор, в основном используется для синхронизации между процессами, между разными потоками процесса), сокетами (
Розетка, поддержка взаимодействия процессов между разными машинами) и т. д., а в Shell обычно напрямую используются каналы и сигналы. Ниже в основном представлены некоторые варианты использования каналов и механизмов сигналов в программировании на языке Shell.
В Linux вы можете пройти
|Соедините две программы, чтобы с ее помощью можно было соединить вход последней программы с выходом предыдущей программы, поэтому это образно называется каналом. В языке C очень просто и удобно создать безымянный канал.
трубкафункция, переходящая в двухэлементную
интервалМассив типа подойдет. Фактически в этом массиве хранятся два файловых дескриптора. После того как родительский процесс записывает что-то в первый файловый дескриптор, дочерний процесс может прочитать это из первого файлового дескриптора.
Если вы используете слишком много командных строк, этот канал
|Его следует использовать часто. Например, выше есть демонстрация.
ПСВывод команды такой:
грепВвод команды:
$ ps -ef |
Вы можете подумать, что этот «канал» настолько волшебен, что действительно может связывать ввод и вывод двух программ. Как они реализованы? Фактически, при вводе такого набора команд текущая оболочка выполнит соответствующий синтаксический анализ, свяжет выходные данные предыдущего процесса с выходным файловым дескриптором канала и свяжет входные данные последующего процесса с входным файловым дескриптором канала. Этот процесс ассоциации перенаправляет функции через ввод и вывод.
обмануть(или
ФКНТЛ) достичь.
Именованный канал на самом деле является файлом (безымянный канал также подобен файлу. Хотя он связан с двумя файловыми дескрипторами, его можно читать только на одной стороне и записывать на другой. Однако этот файл весьма особенный). во время работы должен соблюдаться принцип «первым пришел — первым обслужен», и если вы попытаетесь прочитать из именованного канала, не имеющего содержимого, вы будете заблокированы. Аналогично, если вы попытаетесь выполнить запись в именованный канал, и в данный момент ни одна программа не пытается это сделать. чтобы прочитать его, вы будете заблокированы. Посмотрите эффект ниже.
$ mkfifo fifo_test #Создайте известный канал с помощью команды mkfifo $ echo несколькоfefe > fifo_test #Пытаемся записать содержимое в файл fifo_test, но он заблокирован. Вам нужно открыть другой терминал, чтобы продолжить следующие операции $ cat fifo_test #Открыть другой терминал. , запомни, открой еще один. Пытаюсь прочитать содержимое файла fifo_test немногихfefe.
Вот
эхои
котэто две разные программы, в данном случае по
эхои
котМежду двумя запущенными процессами нет родительско-дочерних отношений. Однако они по-прежнему могут общаться через именованные каналы.
Такой способ связи очень подходит для определенных ситуаций: например, есть такая архитектура. Эта архитектура состоит из двух приложений, одно из которых непрерывно читает.
fifo_testконтент, чтобы определить, что ему следует делать дальше. Если в этом канале нет содержимого, то он там будет заблокирован без потребления ресурсов из-за бесконечного цикла. Другой продолжит течь как управляющая программа.
fifo_testЗапишите в него некоторую управляющую информацию, чтобы сообщить предыдущей программе, что делать. Напишите очень простой пример ниже. Вы можете разработать несколько управляющих кодов, и тогда управляющая программа продолжит работу.
fifo_testЗапишите в него, а затем приложение выполняет различные действия на основе этих управляющих кодов. Конечно, вы также можете пойти в
fifo_testПередайте другие данные, кроме управляющего кода.
код приложения
$ cat app.sh #!/bin/bash FIFO=fifo_test while :; do CI=`cat $FIFO` #CI --> Control Info case $CI in 0) echo Число CONTROL равно НУЛЮ, сделайте что-нибудь... ;; 1) echo Номер CONTROL равен ЕДИНИЦЕ, сделайте что-нибудь ... ;; *) echo Номер CONTROL не распознан, сделайте что-нибудь еще... ;;
Код управляющей программы
$ cat control.sh #!/bin/bash FIFO=fifo_test CI=$1 [ -z $CI ] && echo, информация об управлении не должна быть пустой && выход echo $CI > $FIFO
Одна программа контролирует работу другой программы через каналы
$ chmod +x app.sh control.sh #Измените права доступа к исполняемым файлам этих двух программ, чтобы пользователи могли их выполнять $ ./app.sh #Запустите это приложение в терминале и отправьте управление через ./control.sh Проверьте вывод после кода КОНТРОЛЬНЫЙ номер равен ЕДИНИЦЕ, сделайте что-нибудь еще... #После отправки 1, КОНТРОЛЬНЫЙ номер равен НУЛЮ, сделайте что-нибудь... #После отправки 0, КОНТРОЛЬНЫЙ номер не распознается, сделайте что-нибудь еще... #Отправляем неизвестное сообщение после управляющего кода $ ./control.sh 1 #В другом терминале отправляем управляющую информацию для контроля работы приложения $ ./control.sh 0 $ ./control.sh 4343
Такая архитектура приложения очень подходит для разработки локальных многопрограммных задач в сочетании с .
веб-CGI, то он также будет соответствовать требованиям дистанционного управления. представлять
веб-CGIЕдинственное изменение заключается в том, что программа управления
./control.shвставить
сетьиз
компьютерная графикакаталог и внесите в него некоторые изменения, чтобы он соответствовал
компьютерная графикаспецификации, которые включают представление формата вывода документа (необходимо выводить в начале файла
контент-tpye: text/htmlи пустая строка) и получение входных параметров
(ИнтернетВходные параметры хранятся в
QUERY_STRINGпеременные среды). Итак, очень простой
компьютерная графикаУправляющую программу можно написать так:
#!/bin/bashFIFO=./fifo_testCI=$QUERY_STRING[ -z $CI ] && echo, управляющая информация не должна быть пустой && exitecho -e тип содержимого: text/htmlnnecho $CI > $FIFO
При фактическом использовании, пожалуйста, убедитесь, что
control.shвозможность доступа
fifo_testPipe и имеет права на запись для управления через браузер.
app.sh:
http://ipaddress_or_dns/cgi-bin/control.sh?0
знак вопроса
?Следующее содержание
QUERY_STRING, аналогично предыдущему
1 доллар.
Такое применение имеет большое практическое значение для дистанционного управления, особенно дистанционного управления встраиваемыми системами. На прошлогоднем летнем курсе мы таким образом реализовали дистанционное управление моторами. Сначала реализовано простое приложение для управления вращением двигателя, включая управление скоростью, направлением и т.д. Чтобы обеспечить дистанционное управление, мы разработали несколько управляющих кодов для управления различными свойствами, связанными с вращением двигателя.
В языке C, если вы хотите использовать именованный канал, это похоже на Shell, за исключением того, что при чтении и записи данных используйте
читать,
писатьЗвоните, создайте
фифоИспользуется, когда
мкфифовызов функции.
Сигналы — это программные прерывания, к которым пользователи Linux могут получить доступ через
убийствоКоманда отправляет процессу определенный сигнал, или некоторые сигналы могут быть отправлены через клавиатуру, например:
CTRL+Сможет вызвать
СГИИНТсигнал, в то время как
CTRL+может вызвать
СГИКВИТСигналы и т. д. Кроме того, ядро также будет отправлять сигналы процессу при определенных обстоятельствах, например, при доступе к памяти за пределами ее границ.
СГИСЭГВСигналы, конечно, и сам процесс тоже могут проходить
убийство,
подниматьПодождите, пока функция отправит сигнал самой себе. Для типов сигналов, поддерживаемых в Linux, вы можете передать
человек 7 сигналили
убить -лСм. соответствующие списки и инструкции.
Для некоторых сигналов процесс будет иметь ответные действия по умолчанию, а для некоторых сигналов процесс может их просто игнорировать. Конечно, пользователи также могут установить специальные функции обработки для определенных сигналов. В оболочке вы можете передать
ловушкакоманда (встроенная команда оболочки) для установки действия в ответ на сигнал (команду или определенную функцию), а на языке C вы можете использовать
сигналВызовите функцию-обработчик, зарегистрированную для сигнала. Это всего лишь демонстрация
ловушкаИспользование команды.
$ function signal_handler { echo hello, world. } #Определите функцию signal_handler $ catch signal_handler SIGINT #Выполните настройку этой команды: напечатайте hello, world при получении сигнала SIGINT $ hello, world #Нажмите CTRL+C, чтобы увидеть экран Привет и мировые строки выводятся
Аналогично, если вы установите ответное действие сигнала 0, вы можете использовать
ловушкаДля моделирования программы на языке C
выходРегистрация функции завершения программы, то есть через
ловушка signal_handler SIGQUITнабор
сигнал_обработчикФункция будет выполнена при выходе из программы. Сигнал 0 является специальным сигналом в
POSIX.1Сигнал номер 0 определяется как нулевой сигнал, который часто используется для определения того, существует ли еще определенный процесс. Этот сигнал срабатывает при выходе из программы.
$ cat sigexit.sh#!/bin/bashfunction signal_handler { echo hello, world}trap signal_handler 0$ chmod +x sigexit.sh$ ./sigexit.sh #Actual Shell-программирование будет использовать этот метод для некоторой очистки при выходе из программы Завершение работы над временными файлами, здравствуй, мир
Когда мы передаем несколько команд через
|,>,<, ;, (,)В сочетании друг с другом эта последовательность команд обычно запускает несколько процессов, которые взаимодействуют через каналы и т. д. Иногда при выполнении задачи необходимо обработать и другие задачи, поэтому вы часто добавляете & в конце последовательности команд или после выполнения команды нажимаете
CTRL+ZПриостанавливает выполнение предыдущей команды. для выполнения других задач. Выполнив некоторые другие задания, пройдите
фгКоманда переключает фоновую задачу на передний план. Такой процесс управления обычно называется управлением заданиями, а эти последовательности команд называются заданиями. Это задание может включать одну или несколько программ, один или несколько процессов. Ниже показано несколько часто используемых операций управления заданиями.
$ сон 50 &[1] 11137
Используйте встроенные команды Shell
фгВыведите задание 1 на передний план и нажмите
CTRL+ZПриостановить процесс
$ fg %1sleep 50^Z[1]+ Остановленный сон 50
$ jobs # Проверить текущий статус задания, одно задание остановлено [1] + Остановлен сон 50$ сна 100 & # Разрешить другому заданию работать в фоновом режиме [2] 11138$ jobs # Проверить текущий статус задания, одно выполняется, а другое остановлен [ 1]+ Остановлен сон 50[2]- Выполняется сон 100 &
$ bg %1[2]+ сон 50 &
Однако, чтобы использовать управление заданиями из командной строки, текущая оболочка, драйвер терминала ядра и т. д. должны поддерживать управление заданиями.
«Продвинутое программирование в среде UNIX».