Chạy lệnh khi khởi động / đăng nhập (Mac OS X)


53

Tôi đã tự hỏi tập tin nào tôi nên đặt lệnh bash này để nó sẽ được chạy khi khởi động.

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log

Tôi đã được cọ rửa lưới và nghĩ rằng đó là giữa ~/.bashrc, ~/profile, /etc/bashrc, /etc/profilehoặc ~/.bash_profile. Mặc dù tôi đã thử những thứ này và chúng dường như chạy trên thiết bị đầu cuối khởi động chứ không phải Mac . Tôi có thiếu một tập tin không?

Câu trả lời:


33

Chính thức không ai trong số này. Cách gợi ý của Apple là sử dụng launchd . Guis để thiết lập tính năng này bao gồm lingonLaunch Control

Đối với các tệp bạn đề cập đến các tệp trong thư mục chính ~ / .bashrc, ~ / profile, ~ / .bash_profile chỉ được bắt đầu khi bạn đăng nhập qua thiết bị đầu cuối. Những cái trong / etc được chạy bởi shell bắt đầu cho tất cả người dùng trước những cái trong thư mục chính nhưng chỉ khi đăng nhập người dùng được thực hiện .. hướng dẫn sử dụng bash

Kịch bản khởi động Unix có liên quan / etc / rc * nhưng đối với OSX chỉ cần sử dụng công cụ launchd


1
Vì vậy, nếu lệnh của tôi được chèn vào một trong hai tệp trong /etcđó thì có nên chạy khi khởi động không? Có vấn đề gì trong đó không?
Wolfy87

1
/etc/bashrcvà cứ thế được chạy khi bạn khởi động shell, giống như ~/.bashrc- chỉ là cái trước sẽ được chạy bất cứ khi nào bất kỳ người dùng nào khởi động shell, thay vì chỉ người dùng của bạn.
Scott

@Scott là chính xác Tôi đã sửa câu trả lời của mình
user151019

4
Được rồi, nhưng tôi không thể tìm ra cách sử dụng launchd, tôi đã thử tạo một tệp plist cho chương trình của mình nhưng tôi không biết làm thế nào để chạy nó hoặc làm thế nào để chạy nó khi khởi động.
Wolfy87

1
Liên kết @Mark đến "launchd" bị hỏng :(
Artem

58

Để chạy lệnh khi khởi động trên OS X, bạn cần sử dụng launchd.

Nếu bạn không muốn sử dụng Lingon , bạn cần tạo launchdDanh sách tài sản. Đây là một tệp XML, vì vậy bạn có thể làm điều đó với trình soạn thảo văn bản yêu thích của mình hoặc thay vào đó, bạn có thể sử dụng Trình soạn thảo danh sách tài sản được cài đặt với Mac OS X Dev Tools. Tạo như sau:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>some.meaningful.name</string> <!-- org.mongodb.mongodb perhaps? -->

    <key>OnDemand</key>
    <false/>

    <key>UserName</key>
    <string>anAppropriateUser</string>

    <key>GroupName</key>
    <string>anAppropriateGroup</string>

    <key>ProgramArguments</key>
    <array>
            <string>/Applications/MongoDB/bin/mongod</string>
            <string>--dbpath</string>
            <string>/usr/local/mongo/data</string>
            <string>--fork</string>
            <string>--logpath</string>
            <string>/usr/local/mongo/log</string>
    </array>
</dict>
</plist>

Lưu cái này vào /Library/LaunchAgents/some.meaningful.name.plist(bạn sẽ cần một tài khoản quản trị viên và / hoặc sudo), sau đó mở một thiết bị đầu cuối và làm:

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist

Điều này sẽ khiến launchd tải mục sẽ khiến nó khởi động MongoDB khi khởi động. Như một phần thưởng, launchdsẽ giám sát nó và, nếu nó thoát vì bất kỳ lý do gì, nó sẽ được bắt đầu lại. Để thoát khỏi mục chỉ cần thay thế tải trong lệnh trên bằng unload.


1
Trang này ( developer.apple.com/l Library / mac / document / Magnwin / Reference / Lỗi ) liệt kê rất nhiều điều mà một thứ gì đó được khởi chạy bởi launchd không nên làm. Nếu tôi muốn chạy một lệnh tùy ý khi khởi động, tôi có thể không có quyền kiểm soát và lệnh có thể sẽ tiếp tục làm những việc đó. Ngoài ra, tôi có thể không muốn launchd khởi động lại và mục dừng lại vì nó là một lần hoặc tự xử lý khởi chạy lại. Tôi nên làm gì trong những trường hợp này?
Michael

@ Hủy bỏ, cảm ơn bạn. Đây là câu trả lời hữu ích nhất tôi tìm thấy trên internet.
Dmitriy

5
Điều này sẽ cố gắng chạy ứng dụng cứ sau 10 giây, hoạt động tốt cho các dịch vụ không chết. Nếu đây là một tập lệnh chạy một lần đúng giờ (trong trường hợp của tôi, nhắn tin một lần Slack khi khởi động lại) sẽ thêm <key>LaunchOnlyOnce</key><true/>vào lệnh.
msanford

Điểm tuyệt vời ông Sanford. launchd không từ bỏ sẽ tạo ra các tệp nhật ký khổng lồ, sau đó làm chậm máy Mac của bạn (do đọc và ghi các tệp nhật ký lớn như vậy liên tục). Tôi có thể sử dụng bản sửa lỗi đó trên một số phần mềm thương mại được viết xấu đang chạy trên máy tính của tôi.
Foliovision

1
Lưu ý đến bản thân: Nếu bạn cần các biến môi trường: serverfault.com/questions/111391/
Kẻ

48

Một giải pháp đơn giản khác từ Stack Overflow : Bạn có thể:

  • Bắt đầu Automator.app;
  • Chọn "Ứng dụng";
  • Nhấp vào "Hiển thị thư viện" trên thanh công cụ (nếu bị ẩn);
  • Thêm "Chạy tập lệnh shell" (từ Tác vụ / Tiện ích);
  • Sao chép và dán tập lệnh của bạn vào cửa sổ;
  • Kiểm tra nó;
  • Lưu nó ở đâu đó: một tệp được gọi your_name.appsẽ được tạo);
  • Tùy thuộc vào phiên bản MacOSX của bạn:
    • phiên bản: Đến System Preferences → Accounts → Đăng nhập mặt hàng, hoặc
    • Mới phiên bản: Đến System Preferences → Users and Groups → Đăng nhập mục (phía trên bên phải);
  • Thêm ứng dụng mới được tạo này;

Đăng xuất, đăng nhập lại, và bạn nên hoàn thành. ;)


2
Đã thử nghiệm và hoạt động và nó không yêu cầu chỉnh sửa rườm rà rườm rà cũng như ứng dụng Lingon trả phí.
Lukasz

4
Tuy nhiên, nó có thêm khoảng 1804k nồi hơi vào bản ba dòng của bạn!
android.weasel

1
Cảm ơn các hướng dẫn chi tiết về làm cho một cái gì đó hữu ích với Automator. Điều này sẽ giúp tôi không chỉ với một nhiệm vụ. Cảm ơn bạn vui lòng Jaime. Tôi đang sử dụng nó để tắt Turbo Boost thông qua Turbo Boost Switcher. Tôi sở hữu phiên bản trả tiền nhưng cơ chế cấp phép đủ khủng khiếp Tôi thích sử dụng phiên bản miễn phí yêu cầu khởi chạy qua thiết bị đầu cuối để tránh yêu cầu mật khẩu quản trị viên mỗi khi thức dậy.
Foliovision

1
@ android.weasel Xem câu trả lời của Geekarist superuser.com/a/995564/255375
JD

Superuse-Ful :-D, +1
Mukul Goel

28

Để khởi chạy các lệnh khi đăng nhập, bạn có thể làm điều này:

  • Tạo một tệp văn bản chứa các lệnh của bạn (bash script):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • Lưu tập tin này vào ~/Library/Startup.cmd

  • Bạn có thể kiểm tra nó bằng cách bấm đúp vào tệp trong Finder
  • Làm cho nó thực thi: chmod +x ~/Library/Startup.cmd
  • Thêm tệp này vào Tùy chọn hệ thống> Tài khoản> Mục đăng nhập

3
câu trả lời tốt nhất và dễ nhất imho. dễ dàng hơn nhiều so với giải pháp được chấp nhận. lưu ý rằng đó là trong Tùy chọn hệ thống> Người dùng & Nhóm> Mục đăng nhập ... (không phải Tài khoản) ... và cũng lưu ý rằng tệp có thể ở bất cứ đâu, cũng không phải kết thúc bằng .cmd. chỉ cần chmod + x nó.
foreyez

5
Tuy nhiên, các mục đăng nhập chạy khi đăng nhập, không phải lúc khởi động hệ thống. Nếu bạn chạy một máy chủ, đó là một sự khác biệt lớn.
not2savvy

Bạn nói đúng @ not2savvy. Đối với máy chủ, tôi muốn giới thiệu câu trả lời của @ Sridhar-Sarnobat @reboot. Tuy nhiên, câu trả lời của tôi sẽ cho phép bắt đầu một chương trình đồ họa, đó là lý do tại sao tôi nghĩ nó hữu ích.
Geekarist

Tại sao kết thúc bằng cmdthay vì sh?
Simin Jie

3

Bạn sẽ phải xem cách thức launchdlaunchctlhoạt động trên MacOS. Bạn có thể bắt đầu bằng cách đọc các trang man cho cả hai lệnh. Sau đó, bạn có thể nhìn vào bên trong /Library/LaunchAgents//Library/LaunchDaemons/ví dụ về cách thiết lập các ứng dụng để tải vào các thời điểm khác nhau thông qua launchctlgiao diện.

Đây là một ví dụ tôi tìm thấy trên Stack Overflow có thể giúp bạn hơn nữa.



0

Tôi đã quan tâm đến một câu trả lời unix rất đơn giản cho vấn đề này và tìm thấy nó ở một trang web khác . Dưới đây là một bản tóm tắt của giải pháp.

Tiêu chuẩn cho shell đăng nhập là luôn tìm kiếm các tệp cấu hình bash có "profile" trong tên, theo thứ tự này: / etc / profile, ~ / .bash_profile, sau đó ~ / .bash_login và cuối cùng ~ / .profile. Khi thoát vỏ đăng nhập, họ đọc ~ / .bash_logout.

Trong trường hợp của tôi, tôi chỉ tạo ~ / .bash_profile và sau đó tôi mở tùy chọn cho ứng dụng Mac Terminal và thay đổi tùy chọn "Shell mở bằng" từ mặc định thành / bin / bash. Đó là nó. Sạch sẽ và đơn giản.


-3

thiết bị đầu cuối mở, loại

nano ~/.bash_profile

sau đó thêm văn bản này vào tập tin:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log

3
Điều này sẽ cho rằng bạn mở một cửa sổ Terminal sau khi đăng nhập.
Arjan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.