Завершить процесс, когда PID постоянно меняется

  1. Я не уверен насчет старых программ Qt, но современные фреймворки Qt работают на концепции "сигналов и слотов" (http://doc.qt.io/qt-4.8/signalsandslots.html). Я могу предположить, что автор/создатель Konsole создал связь между событием нажатия кнопки и функцией, генерирующей новую вкладку, но не создал связь между опцией программы --new-tab и этой функцией (в то время).

  2. Я не знаю способа исправить это в вашей текущей ситуации (с установленными версиями программного обеспечения и фреймворка), однако, эта опция --new-tab была доступна в более поздних версиях Konsole:

    --new-tab Create a new tab in an existing window rather
     вместо создания нового окна
    --tabs-from-file  Создать вкладки, как указано в заданном файле tabs
     конфигурационный файл
    
  3. Информация о версии:

    Qt: 5.5.1
    KDE Frameworks: 5.18.0
    Konsole: 15.12.3
    

    Если это возможно (исключая любые несовместимости с критически важными сервисами/программами), самым простым решением может быть просто обновление Konsole и/или KDE до более новой версии.

9
29.12.2016, 01:53
4 ответа

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

pgrep mtp | xargs -i pstree -ps {}

Или, в качестве альтернативы, вы можете использовать параметр ppid ps:

pgrep mtp | while read line; do ps -p $line -o ppid; done

Затем вы можете убить родительский процесс

8
27.01.2020, 20:07

Вы можете использовать pkill mtp или kill -9 pidof mtp

Обратите внимание, что если существует несколько процессов mtp, обе эти команды уничтожат все процессы mtp в системе.

Рами Розен

0
27.01.2020, 20:07

Я выпустил

ps aux | grep mtp

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

, а затем

pkill -9 gvfsd-mtp

сделал свое дело.

Но я предполагаю, что приведенный выше ответ тоже будет работать:)

0
27.01.2020, 20:07

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

pkill name_of_process

или

kill -kill $(ps -A | grep name_of_process | awk '{print $1}')

Узнайте больше об убийстве здесь:https://www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/

Примечание.:Поиск, выполняемый grep или sed, чувствителен к -регистру, и вы должны убедиться, что конкретный процесс сужен до уникального идентификатора, отличного от PID, прежде чем вы сможете убить его, используя эти Примеры.

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

ps -o ppid=$(ps -A | grep name_of_process | awk '{print $1}')

Оттуда вы можете убить родительский процесс, так как у вас есть его PPID.

Если вы не можете убить родительский процесс, вам придется прибегнуть к первому решению. Проблема в том, что иногда PID процессов меняется быстрее, чем вы можете его найти. В этом случае вы можете использовать Sed вместо Grep. Первый пример становится:

kill -kill $(ps -A | sed '/name_of_process/!d' | awk '{print $1}')

Чтобы еще больше ускорить работу, вы можете улучшить результаты, возвращаемые командой ps , используя другие флаги other-A . Посмотрите справочную страницу ps:

https://www.man7.org/linux/man-pages/man1/ps.1.html

Иногда процесс продолжается с помощью демона. Посмотрим, сможешь ли ты убить и это.

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

https://linoxide.com/linux-command/linux-killall-my-options/

1
10.09.2020, 23:05

Теги

Похожие вопросы