วิธีฆ่ากระบวนการใน Mac OS X และไม่ได้รีสตาร์ทด้วยตัวเอง


29

เมื่อฉันรันsudo kill -9 [PID]ด้วย ID กระบวนการที่เหมาะสมกระบวนการจะหยุดทำงาน แต่จะเริ่มใหม่และมี PID ใหม่ ฉันพยายามที่จะฆ่าmysqldกระบวนการ

ฉันจะเลียนแบบการตรวจสอบกิจกรรมในการฆ่ากระบวนการได้อย่างไร ในการตรวจสอบกิจกรรมเมื่อคุณกด "ออกจากกระบวนการ" กระบวนการหยุดทำงานอย่างถาวรจะถูกยกเลิกโดยสิ้นเชิง ฉันคิดว่าkillจะทำสิ่งเดียวกันใช่มั้ย

ฉันมีทั้งตัวตรวจสอบกิจกรรมและเทอร์มินัลติดกันเพื่อดูว่าคำสั่งใช้งานได้หรือไม่ แต่ทุกครั้งที่ทำsudo kill -9 [PID]กระบวนการในการตรวจสอบกิจกรรมจะไม่หายไปมันแค่รีเฟรชด้วย PID ใหม่

ดังนั้น ... ฉันจะฆ่าmysqldกระบวนการผ่านเทอร์มินัลได้อย่างไร


ฉันทำมันจากการตรวจสอบกิจกรรมเพราะคำสั่ง 'ฆ่า' ไม่รู้จัก PID อีกครั้งซึ่งแตกต่างจากกรณีของคุณ mysqld ของฉันไม่ได้รีสตาร์ททันทีที่ฉันฆ่ามันจากการตรวจสอบกิจกรรม
Yoosaf Abdulla

อุ๊ย! อย่าใช้ -9 เว้นแต่คุณต้องการจริงๆ มันเป็นสิ่งที่รุนแรงที่ต้องทำกับกระบวนการ สัญญาณอื่นอนุญาตให้กระบวนการยุติอย่างเป็นระเบียบ แต่ไม่ใช่ -9! ดังนั้นหมายความว่าบัฟเฟอร์ RAM ไม่ได้ถูกฟลัชจากดิสก์ นี่เป็นสิ่งที่เลวร้ายอย่างยิ่งที่ต้องทำกับฐานข้อมูลที่อยู่ในขั้นตอนการทำงาน คุณจะกลับมาที่โต๊ะที่เสียหาย
Jan Steinman

คำตอบ:


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แต่ฉันมีปัญหากับสิ่งนั้นดังนั้นฉันจึงพยายามฆ่ากระบวนการโดยตรง
Hristo

4
หากมีการปรับปรุงใหม่หลังจากkill -9การเปิดตัวอาจมีส่วนเกี่ยวข้องแม้ว่าทางอ้อม คุณสามารถบอกได้โดยใช้launchctl list

รายการไม่มี "mysql" อยู่ในนั้น ฉันจะลองคำสั่งของคุณขึ้นด้านบน
Hristo

เปลี่ยนเส้นทาง STDOUT และ STDERR เป็น / dev / null
Hello71

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ชื่อ

นอกจากนี้คุณยังสามารถติดตั้งระบบฐานชงเรียกว่าservicesเพื่อจัดการการใช้งานบริการติดตั้ง Brew ทั้งหมดตามที่อธิบายไว้ในโพสต์นี้ - http://robots.thoughtbot.com/starting-and-stopping-background-services-with-homebrew I แต่ไม่ได้ลองด้วยตัวเองดังนั้น YMMV


2
นี่คือสิ่งที่แก้ไขให้ฉัน ความเจ็บปวดเสมอเมื่อคุณต่อสู้หลายวิธีในการเรียกใช้สแต็ค LAMP ในพื้นที่
Patrick

ฉันต้องใช้เส้นทาง 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}

6

ยกเลิกการโหลดบริการและหยุด daemon:

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

โหลดบริการและเริ่ม daemon:

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

สิ่งนี้ใช้งานได้สำหรับฉันยกเว้นว่าเป็นcom.oracle.oss.mysql.mysqld.plist MySQL ภายในเครื่องของฉันติดตั้งจากการดาวน์โหลดจาก MySQL ไม่ใช่ผ่าน homebrew
เจสัน

2

คุณพยายามฆ่ากระบวนการอะไร กระบวนการบางอย่างใน Mac OS X (เช่น Dock, กระบวนการบางระบบ) จะเกิดขึ้นใหม่โดยอัตโนมัติหากพวกเขาถูกฆ่า


ฉันพยายามจะฆ่าmysqldกระบวนการ
Hristo

อาจมีการจัดการโดยlaunchdแล้วซึ่งจะเริ่มต้นใหม่หากกระบวนการตาย
mipadi

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.