วิธีเริ่ม / หยุด / เริ่มบริการ launchd จากบรรทัดคำสั่ง


149

ฉันจะเริ่มต้นใหม่พูดเช่น httpd หรือ afpd ของฉันใช้ Mac OS X ใด ๆ > = 10.5 (Leopard-) โดยไม่ต้องใช้ GUI และไปที่การตั้งค่าระบบ -> การแชร์และยกเลิกการเลือก / การตรวจสอบ "การแบ่งปันเว็บ"

ฉันกำลังมองหาเทียบเท่าบัญญัติเพื่อ invoke-rc.d apache2 restartDebian

แก้ไข: คำถามเกี่ยวกับการบริการควบคุม launchd โดยทั่วไปไม่เฉพาะ Apache (- ซึ่งเป็นเพียงตัวอย่าง)


1
จากคำตอบจนถึงตอนนี้ถูกต้องหรือไม่ที่จะถือว่าไม่มีคำสั่ง launchctl คำเดียวในการรีสตาร์ทบริการ
JS

@JS ตามหน้าคู่มือkickstartพร้อมกับ-kตัวเลือกที่ดูเหมือนว่าจะทำเคล็ดลับ ดูคำตอบของฉันด้านล่าง ...
เช็น

คำตอบ:


158

สวัสดี launchctl (8) เป็นเพื่อนของคุณ เพียงจำไว้ว่าบริการบางอย่าง (เช่น sshd) ถูกปิดใช้งานในไฟล์การกำหนดค่าดังนั้นคุณจะต้องใช้-wสวิตช์เมื่อโหลด นี่คือตัวอย่าง sshd:

$ sudo launchctl load -w /System/Library/LaunchDaemons/ssh.plist 

คุณสามารถหยุดบริการโดยใช้คำunloadสั่งย่อย

$ sudo launchctl unload  /System/Library/LaunchDaemons/ssh.plist 

เพื่อแสดงรายการบริการตามที่คุณอาจเดาได้แล้วให้ใช้คำสั่งย่อย 'list';)

ขอให้สนุกนะ


9
นอกจากlaunchctl listนี้ไม่บ่น แต่ไม่ได้แสดงทุกอย่างที่sudo launchctl listจำเป็นสำหรับการที่
conny

9
ไม่ใช่ว่าจะไม่แสดงทุกอย่าง แต่จะแสดงรายการที่แตกต่างอย่างสิ้นเชิง เมื่อคุณเรียกใช้launchctlในฐานะผู้ใช้ปกติจะแสดง / จัดการ LaunchAgents ที่ทำงานในเซสชันผู้ใช้ของคุณ รันเป็น root โดยจะแสดง / จัดการ LaunchDaemons ทั่วทั้งระบบ
Gordon Davisson

1
ฉันเห็น "com.openssh.sshd" ในรายการนั้นดังนั้นฉันเดาว่าการตั้งค่านั้นเป็น "โหลด" ตอนนี้ทำไมตัวอย่างมาถึงsudo launchctl start com.openssh.sshdไม่ทำอะไรเลยไม่ใช่ evan ล้มเหลวพร้อมกับข้อความแสดงข้อผิดพลาดแม้แต่น้อยก็เปิดตัวอะไรได้เลย?
conny

2
@conny มันอาจสร้างความสับสนในกรณีทั่วไป แต่เมื่อคุณเขียนบริการและคุณสงสัยว่ามีบางสิ่งที่น่ารังเกียจเกิดขึ้นเมื่อเริ่มต้นคุณสามารถโหลดได้ครั้งเดียวและใช้ 'หยุด' / 'เริ่ม' เพื่อแก้ไขปัญหา .
เนย์เดน

6
ทำไมไม่พูดถึงlaunchctl start <label>หรือlaunchctl stop <label>? หากเริ่มต้นแล้วโดย launchctl คุณไม่จำเป็นต้องโหลดไฟล์ plist ใหม่ (ยกเว้นว่ามันจะเปลี่ยนไปเช่นกัน?) มันน่ารำคาญที่ไม่มีrestartหรือreloadคำสั่ง ใครรู้วิธีเดียวในการทำ (เช่น) mongod รับการเปลี่ยนแปลงไฟล์ config? ... stop ... && ... start ...ฉันแค่ไม่พอใจกับ
Brian

7

sudo launchctl load -w /System/Library/LaunchDaemons/org.apache.httpd.plist


5

ในการรีสตาร์ทเซอร์วิสคุณสามารถใช้launchctl kickstartคำสั่งพร้อมกับ-kตัวเลือก ตัวอย่างเช่นในการรีสตาร์ท apache คุณสามารถใช้

sudo launchctl kickstart -k system/org.apache.httpd

ข้อมูลนี้มาจากlaunchctlหน้าคู่มือ:

 kickstart [-kp] service-target
          Instructs launchd to run the specified service immediately, regardless of its
          configured launch conditions.

          -k       If the service is already running, kill the running instance before
                   restarting the service.
          [...]

1
เมื่อฉันลองใช้บริการของฉันหยุดทำงานมันไม่หยุดหลังจากรอสั้น ๆ "ฆ่า" บน pid ไม่ได้ช่วยทำ "ฆ่า -9" บน pid ฆ่ากระบวนการและให้เริ่มต้น (ที่ทำงานอยู่ในที่อื่น คอนโซลในขณะที่ฉันพยายามที่จะฆ่ากระบวนการ) ดำเนินการต่อและเริ่มบริการอีกครั้ง ฉันไม่ได้รอนานมากก่อนที่จะเริ่มฆ่าสิ่งต่าง ๆ ด้วยตนเองดังนั้นการรอนานพออาจจะเพียงพอที่จะแก้ปัญหาได้
ซามูเอลÅslund

3

คุณสามารถทำได้

sudo launchctl stop com.openssh.sshd

หากคุณไม่ทราบชื่อบริการเต็มรูปแบบคุณสามารถทำได้

sudo launchctl list

หากคุณยังไม่พบบริการที่คุณคาดหวังให้ลองเรียกใช้โดยไม่ระบุตัวตนของรูท:

launchctl list

และคุณไม่จำเป็นต้องยกเลิกการโหลดและโหลดบริการ


1
ฉันลองสิ่งนี้และตอนนี้ฉันไม่สามารถใช้sshจาก Mac ได้ การรีบูตเครื่องไม่สามารถแก้ไขได้ แทนที่stopด้วยstartยังไม่แก้ไข
ฉัน

1
ฉันลองสิ่งนี้แล้วก็ยังสามารถใช้กับ Mac ได้!
Michael

@ dmitriy-apollonin มันไม่ทำงานคุณต้องใช้sudo unload /System/Library/LaunchDaemons/ssh.plistแทน
SebMa

คำถามคือเกี่ยวกับการเริ่มบริการใหม่ แต่ฉันไม่คิดว่าlaunchctl stopจะเริ่มบริการใหม่
jochen

2

launchctlคุณกำลังมองหา

SYNOPSIS
 launchctl [subcommand [arguments ...]]

DESCRIPTION
 launchctl interfaces with launchd to load, unload daemons/agents and gen-
 erally control launchd.  launchctl supports taking subcommands on the
 command line, interactively or even redirected from standard input.
 These commands can be stored in $HOME/.launchd.conf or /etc/launchd.conf
 to be read at the time launchd starts.

2
แต่การอ่าน man-page นั้นไม่ได้บอกฉันว่าอะไรที่เทียบเท่ากันinvoke-rc.d my-little-daemon restartคือ ... มันหมายถึง "job_label" แต่ไม่ได้บอกวิธีการที่จะแสดงรายการ "job_label" ที่มีอยู่
conny

ฉันคิดว่าคำตอบของเนย์ได้รับการคุ้มครองนี้
eric.s

2

ในกรณีที่คุณกำลังมองหาlaunchctl reloadคุณสามารถกำหนดฟังก์ชั่นเชลล์ในของคุณ~/.bashrc/.zshrcตามที่ฉันได้:

function lctl {
    COMMAND=$1
    PLIST_FILE=$2
    if [ "$COMMAND" = "reload" ] && [ -n "$PLIST_FILE" ]
      then
        echo "reloading ${PLIST_FILE}.."
        launchctl unload ${PLIST_FILE}
        launchctl load ${PLIST_FILE}
      else
        echo "either command not specified or plist file is not defined"
    fi
}

การดำเนินการคำสั่งดูเหมือน -> lctl reload <your-plist-name>.plist


1
sudo apachectl restart

ทำงานร่วมกับระบบปฏิบัติการอื่น ๆ รวมถึงเป็นส่วนหนึ่งของ Apache


1
แม้ว่าหัวข้อไม่ได้พูดถึง Apache โดยเฉพาะอย่างยิ่งฉันควรจะได้คาดว่าจะตีความนี้ .... ฉันขอโทษ แต่นั่นก็ไม่ใช่สิ่งที่ผมกำลังมองหา :)
Conny

ตกลงฉัน catched ส่วน httpd ซึ่งใช้ apachectl เป็นตัวแปรง่ายขึ้น :)
สเวน

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