Команда закрытия программы linux

Я использую Ubuntu 10.10, и у меня есть программа Python (Mnemosyne), которая синхронизирует файлы данных с помощью Dropbox. Вот мой проблемный сценарий. Я оставляю программу работающей дома и иду на работу, но если я открываю программу на работе и работаю над ней, файл данных изменяется, и я теряю свой прогресс дома, когда выхожу (он автоматически сохраняет) при выходе.

Я думал, что смогу создать задание cron для автоматического закрытия Mnemosyne каждое утро, независимо от того, вспомнил я об этом или нет, но если я использую команду kill, она завершается без сохранения файла данных, и в результате получается файл tmp и сообщение об ошибке когда я перезапущу это. Есть ли лучший способ отправки сигнала на выход в эту программу, эмулируя меня нажав файл> выход из меню.

изменён Peter Mortensen 8k
задан biomed 150

7 ответов 7

По вашему описанию, я предполагаю, что это программа с графическим интерфейсом, работающая на X-сервере. Попробуйте wmctrl:

wmctrl -c «RegEx for Window Name»

Linux урок 7. Команды Man, info, ключ —help. Справочная документация команд в Linux.

Со страницы руководства: -c Close the window gracefully.

ответ дан frabjous 9k

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

ответ дан John T 143k

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

ответ дан Linker3000 25k

Есть ли man-страницы по мнемосине? Возможно, в документах есть команда close, которую вы можете использовать в своей работе cron.

ответ дан jmort253 1k

Как правило, единственный способ закрыть программу — это сигнал. Как уже говорили другие, если он не отвечает должным образом на уничтожение по умолчанию (которое отправляет SIGTERM), он также вряд ли будет иметь надлежащий обработчик для других сигналов. Сигнала «добрее нежнее» нет. Все сигналы, кроме SIGKILL, обрабатывают процесс одинаково, запускают обработчик, если он есть, или убивают приложение.

Тем не менее, как приложение с графическим интерфейсом, существует очень малая вероятность того, что оно ссылается на библиотеку, которой вы можете управлять приложением. Вы можете попробовать посмотреть, можете ли вы отправлять ему сообщения с помощью dcop или d-bus. См. Http://dbus.freedesktop.org/doc/dbus-tutorial.html.

ответ дан Rich Homolka 25k

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

ответ дан Peter Eisentraut 6k

Это сильно зависит от приложения. Если авторы mnemosyne не предвидели подобную ситуацию и специально не создали поведение «сохранить и выйти при получении сигнала X», то вы в значительной степени застряли с необходимостью манипулировать его пользовательским интерфейсом для достижения этой цели.

Зависла программа. Решаем зависание linux. Команды kill, killall, pkill, xkill.

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

Читайте также:
Майнкрафт программа на вашем хост компьютере разорвала установленное подключение что делать

Если бы это было приложение командной строки, screen прекрасно работал (я использую его ежедневно только для этой цели, предоставляя мне доступ к одному экземпляру mutt из разных мест), но я не думаю, что он обрабатывает приложения с графическим интерфейсом (страница man) не отображается для ссылки «GUI» или «X»).

Источник: poweruser.guru

Как в Linux корректно завершить сессию пользователя через консоль?

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

Выход из системы с использованием команды exit

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

Выход из системы с использованием команды logout

Команда logout также используется для выхода из текущей сессии в терминале. Как и команда exit, она завершает все процессы, связанные с текущей сессией, и сохраняет все данные. Для выхода из системы нужно выполнить следующую команду:

Выход из системы с использованием комбинации клавиш Ctrl+D

Комбинация клавиш Ctrl+D также используется для выхода из текущей сессии в терминале. Как и команды exit и logout, она завершает все процессы, связанные с текущей сессией, и сохраняет все данные. Для выхода из системы нужно нажать сочетание клавиш Ctrl+D.

Выход из системы с использованием команды shutdown

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

sudo shutdown -h now

Команда sudo позволяет выполнить команду с правами администратора, чтобы завершить работу системы. Опция -h указывает на выключение системы, а аргумент now означает, что действие должно быть выполнено немедленно.

Выход из системы с использованием команды reboot

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

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

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

$ ls -l
total 8
drwxr-xr-x 2 user user 4096 Mar 25 10:02 Documents
drwxr-xr-x 2 user user 4096 Mar 25 10:02 Downloads
$ exit

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

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

$ ls -l
total 8
drwxr-xr-x 2 user user 4096 Mar 25 10:02 Documents
drwxr-xr-x 2 user user 4096 Mar 25 10:02 Downloads
$ logout

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

Пример использования комбинации клавиш Ctrl+D:

$ ls -l
total 8
drwxr-xr-x 2 user user 4096 Mar 25 10:02 Documents
drwxr-xr-x 2 user user 4096 Mar 25 10:02 Downloads
$ Ctrl+D

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

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

$ sudo shutdown -h now

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

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

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

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

Например, чтобы завершить процесс с идентификатором 1234, нужно выполнить команду:

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

Источник: linux16.ru

Фоновые PHP-процессы в Linux

В программирование бывает необходимость писать программы, которые должны работать непрерывно, причины тому могут быть: непрерывное отслеживание изменений на сайте, длительное выполнение какой-либо операции, веб-сокет сервер и другие. И для небольших программ язык PHP, как никогда подходит лучше всего. Здесь я попытаюсь описать возможные шаги, которые нужно предпринять чтобы написать свою программу работающую в среде Linux. Я предполагаю что Вы уже знакомы с Линукс и слова «консоль» и «ssh» Вас уже не пугают. Примеры команд будут запущены в среде Debian Linux 8.4, с PHP 7. Сам PHP 7 установлен как CLI.

Читайте также:
Программа развития кадрового потенциала это документ

Оглавление

  • Процесс в Linux
  • Закрытие процесса
  • Программы Linux для работы с процессами
  • Непрерывный процесс
  • Отвязываемся от консоли
  • Одна программа — один процесс
  • PHP-программа как Unix скрипт

Процесс в Linux

Запуская программу в Unix вы создаёте «процесс», т.е. процессор начинает выполнять инструкции программы. Чтобы не запутаться в названиях «программа» и «процесс» можно представить, что «программа» это некоторая бумага с текстом приказа, а «процесс» это робот который читает приказ и выполняет его. Вполне может быть что процесс может удалить программу, которая его запустила или что процесс запустил другие программы, т.е. вызвал другие процессы.

Запуская программу в Unix процессу присваиваются некоторые параметры, а именно:

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

$ nano sleep.php
$ php sleep.php », это я делаю для того чтобы после запуска в консоли можно было запускать другие программы, т.е. не быть заблокированным своим процессом.

— Имя — имя процесса формируется из имени программы и параметры его запуска. Т.е. если выполнить в консоли « php sleep.php », то процесс будет называться « /usr/local/bin/php sleep.php ». Но так бывает не всегда, при желании процесс может задать себе новое какое пожелает. Пример:

$ nano custom_name_process.php
$ php custom_name_process.php [Э]то»

Вывод команды ps будет напоминать что-то вроде этого.

example 8214 6235 0 12:03 pts/0 00:00:00 Это имя процесс присвоил себе сам

Я всё же рекомендую не использовать в имени процесса UTF-8 символы и спец символы, во избежания проблем с операционными системами Unix, без поддержки Unicode на уровне ядра.

— PPID — PID родительского процесса. У каждого процесса есть родитель, т.е. процесс который его запустил. У родительского процесса также может присутстовать родитель и так вверх по иерархии. На самом верху иерархии находится процесс « init » или « systemd », он является родоначальников всех процессов и его запускает само ядро Linux. У процесса всегда есть родитель, если родительский процесс закрывается все потомки родительского процесса «усыновляются» процессом « init » или « systemd ». Если вы запускаете программу через консоль, то родителем процесса будет консольная программа, вероятно « tcsh », « bash » или « zsh ». Посмотреть иерархию процессов можно так:

$ htop t $ pstree

— UID — UID пользователя, который запустил процесс. После запуска процессу ещё присваивается владелец и группа (почти как у файла) и с правами этого пользователя процесс будет работать. К примеру если мы запустим программу от пользователя «user1» находящегося в группе «group1», то процесс сможет выполнять действия доступные пользователю «user1», и не сможет скажем зайти в папку «/root» или удалить файл, владелец которого является пользователь «user2».

— Аргументы программы — строки указанные в консоле при запуске программы после имени программы через пробел. Например если в консоли запустить программу: «php example.php a b -p1 —test=2», аргументами будут строки «a», «b», «-p1», «—test=2». В PHP аргументы программы можно найти в глобальном массиве $argv, а кол-во аргументов можно найти в глобальной переменной «$argc». Пример:

$ nano arguments.php
$ php arguments.php —param1=1 —param2=2
Array ( [0] => arg.php [1] => —param1=1 [2] => —param2=2 )

Закрытие процесса

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

Читайте также:
Фронтол как выйти из программы

Для того чтобы обратиться к процесс нужно знать его PID или хотя бы имя процесса, чтобы по нему потом определить PID. После того как узнали PID процесса можно отправить сигнал закрытия, это делается командой « kill ». Пример:

$ nano sleep.php
$ php simple.php simple.php» $ kill 12111 $ ps -ef | grep «simple.php»

Бывает такое что процесс не может завершиться, то тогда ему нужно отправить сигнал «принудительное закрытие», это делается командой « kill -9 PID ». Ещё процесс можно завершить по имени процесса, для этого используйте команду « killall ».

Если вы запустили программу и программа заблокировала консоль используйте сочетание клавиш « Ctrl + C » и программа завершится. Или если просто хотите вернуться консоль не закрывая программу, то нажмите « Ctrl + Z », а далее « bg ».

Программы Linux для работы с процессами

Программ для работы с процессами множество, я же расскажу о программах которые мне нравятся больше и популярные примеры их использования. Речь пойдёт о программах: ps , pgrep , kill , htop .

— ps — показывает запущенные процессы и сведения по ним. Примеры:

$ ps # Показать свои запущенные процессы $ ps -ef # Показать все запущенные процессы $ ps -ef | grep «[s]imple.php» # Найти процесс в имени которого встречается «simple.php» *

* — Если написать просто «ps -ef | grep «simple.php»», то отобразиться не только нужный нам процесс и сведения о самом нашем процессе «ps» и это может запутать.

— pgrep — ищет процесс по имени и возвращает PID процесса. В отличии от ps не возвращает PID самого себя, а только нужный нам. В большинстве случаев результат программы pgrep используется другими программами. Примеры:

$ pgrep -u example # Найти PID всех процессов пользователя «example» $ pgrep -f «simple.php» | xargs kill # Найти все программы, в имени которого присутствует «simple.php» и завершить

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

$ kill 11111 # Закрыть процесс с PID «11111» $ kill -9 11111 # Принудительно закрыть процесс с PID «11111» $ kill -s USR1 11111 # Отправить пользовательский сигнал процессу с PID «11111» * $ kill -l # Показать список доступных сигналов

* Если процесс не настроен на «ловлю» этого сигнала процесс завершиться.

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

$ htop # Анализ загруженности процессора и оперативной памяти $ htop —sort-key=PERCENT_MEM # Показать статистику по процессам и отсортировать по использованию оперативной памяти $ htop -p 11111 # Показать статистику по процессу с PID «11111» $ htop t # Показать иерархию процессов $ htop -d 5 # Обновлять статистику каждые 0.5 секунд

— pstree — показать дерево процессов. Можно посмотреть всю иерархию процессов или всех «предков» процесса.

$ pstree # Иерархия всех процессов $ pstree -as 11111 # Показать всех предков процесса с PID «11111»

Непрерывный процесс

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

$ nano background.php
$ php background.php # Запускаем скрипт в фоне $ pgrep -f background.php # Определяем PID процесса $ htop -p 11111 # Мониторим наш процесс
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command 11111 root 20 0 50472 19004 13452 R 00.0 0.5 0:05.27 php background.php

Здесь «usleep» будет означать, время отклика ваше программы на внешние раздражители (сигналы, сокеты и прочее).Теперь вместо почти 100% загруженности получим почти 0% загруженность процессора при простаивании процесса. Вероятно программа, которая работает в фоне будет не просто выполняться в бесконечном цикле, а ждать поступления определённого события (сигналы, таймер, поступление данных на канал или сокет, изменения в файлах и прочее), здесь же скрипт предоставлен в качестве примера.

Отвязываемся от консоли

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru