как убить процесс в Mac OS X и не запускать его самостоятельно

29

Когда я запускаю sudo kill -9 [PID]с правильным идентификатором процесса, процесс останавливается, но затем перезапускается и получает новый PID. Я пытаюсь убить mysqldпроцесс.

Как я могу имитировать Монитор активности при уничтожении процесса? В Мониторе активности, когда вы нажимаете «Выйти из процесса», процесс постоянно останавливается, он полностью завершается. Я полагаю, что killбудет делать то же самое, верно?

У меня были и монитор активности, и терминал рядом друг с другом, чтобы посмотреть, работает ли команда, но каждый раз, когда я это делаю sudo kill -9 [PID], процесс в мониторе активности не исчезает, он просто обновляется с новым PID.

Итак ... как мне убить mysqldпроцесс через терминал?

Христо
источник
Я сделал это с монитора активности, потому что команда kill не распознала PID. Опять же, в отличие от вашего случая, мой mysqld не перезапустился, как только я убил его с монитора активности.
Юзаф Абдулла
Ой! Не используйте -9, если вам действительно не нужно. Это жестокая вещь, чтобы сделать с процессом. Другие сигналы позволяют упорядоченно завершать процесс, но не -9! Это означает, что, к примеру, буферы ОЗУ не сбрасываются на диск. Это особенно плохо делать с базой данных, которая находится в процессе выполнения работы; Вы вернетесь к поврежденным столам.
Ян Стейнман

Ответы:

22

Процесс, который вы убиваете, вероятно, управляется launchd , и правильным способом остановить его и не перезапустить его является использование launchctl unload <path to plist>. PLIST , который контролирует этот процесс находится в любом /Library/LaunchDaemonsили /System/Library/LaunchDaemons. Если это системный процесс, а не ваш собственный, то вам, вероятно, придется использовать sudoего launchctlдля работы по своему усмотрению.

Лучший способ попытаться остановить это может быть;

${MYSQL_HOME}/bin/mysqladmin -u root -proot shutdown > /dev/null 2>&1

источник
Я пытаюсь убить mysqldпроцесс. Я не уверен, является ли это частью LaunchDaemons ... но следующая команда - правильный способ остановить запуск сервера, sudo /usr/local/mysql/support-files/mysql.server stopно у меня возникают проблемы с этим, поэтому я пытаюсь напрямую убить процесс.
Христо
4
если он пересчитывается после того, kill -9как launchd, вероятно, вовлечено, даже если косвенно. Вы можете сказать, используяlaunchctl list
в списке нет «mysql». Я попробую вашу команду наверху.
Христо
Перенаправьте STDOUT и STDERR в / dev / null.
Привет71
7
У меня была та же проблема, и я смог решить, удалив mysql из launchd через sudo launchctl unload /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist
Jeff
11

В паре комментариев упоминается, что «вероятно, задействован launchd» - поэтому я подумал, что это будет дополнительным ответом. Как говорит @ jarrod-roberson, вы можете проверить, участвует ли launchd при первом запуске launchctl list | grep mysqld.

Здесь важно узнать, был ли MySQL установлен с Homebrew или нет - Brew хранит свои launchctlфайлы в другом месте, чем то, куда OSX помещает «обычные» службы.

На моей коробке OSX plistфайлы находятся в ~/Library/LaunchAgents/Итак, я запустил:

launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist

остановить сервер MySQL. Я ранее заглянул /Library/LaunchDaemons/и /Library/LaunchAgentsне нашел файл с mysqldего именем.

Вы также можете установить основанную на brew систему servicesдля управления всеми приложениями служб Brew, как описано в этом посте - http://robots.thoughtbot.com/starting-and-stopping-background-services-with-homebrew I Я сам не пробовал, так что, YMMV.

sameers
источник
2
Это то, что исправило это для меня. Всегда больно, когда вы боретесь с несколькими различными способами локального запуска стека LAMP.
Патрик
Я должен был использовать путь Homebrew, чтобы удалить это, то есть/usr/local/opt/mysql/homebrew.mxcl.mysql.plist
micjamking
10

Я попытался убить процесс, отправив ему TERMсигнал, и это сработало. Команда была:

sudo kill -15 {PID}
Христо
источник
8

Для меня это сработало, когда я понял, какой лейбл я искал.

launchctl list | egrep {DESIRED_LABEL}   
launchctl remove {DESIRED_LABEL}
silverdagger
источник
6

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

sudo launchctl unload -w /Library/LaunchDaemons/com.mysql.mysql.plist

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

sudo launchctl load -w /Library/LaunchDaemons/com.mysql.mysql.plist
Osaev
источник
Это сработало для меня, за исключением того, что com.oracle.oss.mysql.mysqld.plist мой локальный MySQL был установлен при загрузке с MySQL, а не через homebrew.
Джейсон
2

Какой процесс вы пытаетесь убить? Некоторые процессы в Mac OS X (например, Dock, некоторые системные процессы) автоматически возрождаются, если они убиты.

mipadi
источник
Я пытаюсь убить mysqldпроцесс
Христо
Вероятно, управляется launchdтогда, который перезапустит его, если процесс умрет.
Мипади
1

Я решил отредактировать файл /Library/LaunchDaemons/com.mysql.mysql.plist, изменив атрибут true на false

<!--?xml version="1.0" encoding="UTF-8"?-->
<plist version="1.0">
  <dict>
    <key>KeepAlive</key>
    <false />
    <key>Label</key>
    <string>com.mysql.mysqld</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/mysql/bin/mysqld_safe</string>
      <string>--user=mysql</string>
    </array>
  </dict>
</plist>
Марио
источник
0

На вашем компьютере запущен процесс, который блокирует mysql. Бег

ps auxwww | grep mysql

тогда делай

kill -15 {PID}

Мой процесс, который блокировал это был _mysql

Джонатан О
источник