題 在啟動/登錄時運行命令(Mac OS X)


我想知道我應該將這個bash命令放在哪個文件中,以便它將在啟動時運行。

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

我一直在淘網,認為它介於兩者之間 ~/.bashrc~/profile/etc/bashrc/etc/profile 要么 ~/.bash_profile。雖然我已經嘗試了這些,但它們似乎還在繼續 終端啟動    Mac啟動。我錯過了一個文件嗎?


48
2018-01-06 11:24


起源




答案:


官方沒有這些。 Apple提出的方法是使用 的launchd。 Guis設置這個包括 lingon 和 啟動控制

至於你提到的主目錄中的文件〜/ .bashrc,〜/ profile,〜/ .bash_profile只有在你通過終端登錄時才會啟動。 / etc中的那些由shell運行,所有用戶在主目錄之前啟動,但僅在用戶登錄時才運行。 bash手冊

Unix啟動腳本涉及/ etc / rc *但是OSX只使用了launchd的東西


29
2018-01-06 11:37



所以,如果我的命令被插入到任何一個文件中 /etc 它應該在啟動時運行?這是什麼一個重要嗎? - Wolfy87
/etc/bashrc 等你啟動shell時運行等等 ~/.bashrc  - 只是前者將在任何時候運行 任何 用戶啟動一個shell,而不僅僅是你的用戶。 - Scott
@Scott是正確的我已經糾正了我的回答 - Mark
好的,但我無法弄清楚如何使用launchd,我嘗試為我的程序製作一個plist文件,但我不知道如何運行它或如何讓它在啟動時運行。 - Wolfy87
@Mark鏈接到“launchd”被打破:( - Artem


要在OS X上啟動時運行命令,您需要使用 launchd

如果你不想使用 Lingon,你需要創建一個 launchd 物業清單。這是一個XML文件,因此您可以使用自己喜歡的文本編輯器執行此操作,也可以使用隨Mac OS X Dev Tools一起安裝的屬性列表編輯器。創建以下內容:

<?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>

保存這個 /Library/LaunchAgents/some.meaningful.name.plist (您需要一個管理員帳戶和/或 sudo),然後打開一個終端並執行:

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

這將導致launchd加載項目,這將導致它在啟動時啟動MongoDB。作為獎勵, launchd 將監視它,如果它因任何原因退出,它將重新啟動。要刪除該項,只需使用unload替換上述命令中的load。


53
2018-01-06 12:50



這一頁 (developer.apple.com/library/mac/documentation/Darwin/Reference/...)列出了很多由launchd推出的東西不應該做的事情。如果我想在啟動時運行任意命令,我可能無法控制,命令可能最終會執行這些操作。另外,我可能不希望launchd重啟和停止的項目,因為它是一次性的或自己處理重新啟動。在這些情況下我該怎麼辦? - Michael
@Scott,謝謝。這是我在互聯網上找到的最有幫助的答案。 - Dmitriy
這將嘗試每10秒運行一次應用程序,這對於不會死的服務非常有效。如果這是針對一個準時運行的腳本(在我的情況下,在重新啟動時發送一次Slack消息)添加 <key>LaunchOnlyOnce</key><true/> 到了字典。 - msanford
偉大的桑福德先生。不放棄的launchd會創建巨大的日誌文件,然後放慢你的Mac速度(因為不斷讀取和寫入如此大的日誌文件)。我現在可以在我的計算機上運行的一些編寫得很糟糕的商業軟件上使用該修復程序。 - Foliovision
自我注意:如果您需要環境變量: serverfault.com/questions/111391/... - Quandary


Stack Overflow的另一個簡單解決方案: 您可以:

  • 啟動Automator.app;
  • 選擇“應用程序”;
  • 單擊工具欄中的“顯示庫”(如果隱藏);
  • 添加“運行shell腳本”(來自Actions / Utilities);
  • 將腳本複制並粘貼到窗口中;
  • 測試一下;
  • 將它保存在某處:一個名為的文件 your_name.app 將被創造);
  • 根據您的MacOSX版本:
    •  版本:轉到系統偏好設置→帳戶→登錄項目,或
    •  version:進入系統偏好設置→用戶和組→登錄項目(右上角);
  • 添加這個新創建的應用程序;

註銷,重新登錄,您應該完成。 ;)


43
2017-08-23 18:09



測試和工作,它不需要launchd繁瑣的plist編輯或付費Lingon應用程序。 - Lukasz
但是,它確實為你的三行shellcript增加了大約1804k的樣板! - android.weasel
感謝有關使用Automator製作有用內容的詳細說明。這不僅可以幫助我完成一項任務。謝謝你,海梅。我用它來通過Turbo Boost Switcher關閉Turbo Boost。我擁有付費版本但許可機制非常糟糕我更喜歡使用免費版本,這需要通過終端啟動以避免在每次睡眠喚醒時請求管理員密碼。 - Foliovision
@ android.weasel參見Geekarist的回答 superuser.com/a/995564/255375 - J.D.
Superuse-ful :-D,+ 1 - Mukul Goel


要在登錄時啟動命令,您可以執行以下操作:

  • 創建包含命令的文本文件(bash腳本):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • 保存此文件 ~/Library/Startup.cmd

  • 您可以通過雙擊Finder中的文件來測試它
  • 使其可執行: chmod +x ~/Library/Startup.cmd
  • 在系統偏好設置>帳戶>登錄項目中添加此文件

25
2017-11-03 17:53



最好和最簡單的回答imho。比接受的解決方案更容易。請注意,它位於系統偏好設置>用戶和組>登錄項目...(不是帳戶)...還要注意該文件可以在任何地方,也不必以.cmd結尾。只是chmod + x它。 - foreyez
但是,登錄項在登錄時運行,而不是在系統啟動時運行。如果你運行服務器,這是一個很大的區別。 - not2savvy
你是對的@ not2savvy。對於服務器,我會推薦@ Sridhar-Sarnobat的回答 @reboot。但是我的回答是允許啟動圖形程序,這就是我認為它有用的原因。 - Geekarist
為什麼以 cmd 代替 sh? - Simin Jie


你將不得不看看如何 launchd 和 launchctl 在MacOS上工作。您可以從閱讀這兩個命令的手冊頁開始。你可以看看裡面 /Library/LaunchAgents/ 和 /Library/LaunchDaemons/ 有關如何設置應用程序以在不同時間加載的示例 launchctl接口。

這是一個例子 我發現Stack Overflow可能對你有所幫助。


3
2018-01-06 11:32





如果你想要一種適用於Linux和Mac OS X的方法,cron任務應該足夠了(通過執行來編輯你的cron任務 crontab -e):

@reboot /path/to/script

(學分: https://unix.stackexchange.com/questions/49207/how-do-i-set-a-script-that-it-will-run-on-start-up-in-freebsd


3
2018-03-24 19:58





我對這個問題的一個非常簡單的unix答案感興趣,並在另一個問題上找到了它 現場。以下是解決方案的摘要。

登錄shell的標準是始終在名稱中查找名為“profile”的bash配置文件,順序為:/ etc / profile,〜/ .bash_profile,然後是〜/ .bash_login,最後是〜/ .profile。當登錄shell退出時,它們會讀取〜/ .bash_logout。

在我的情況下,我剛剛創建了〜/ .bash_profile然後我打開了Mac終端應用程序的首選項,並將“Shell打開方式”選項從默認更改為/ bin / bash。而已。乾淨簡單。


0
2018-05-22 16:37



做出改變......感謝您的評論 - markgp


打開終端,輸入

nano ~/.bash_profile

然後將此文本添加到文件中:

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

-3
2018-03-11 07:25



這將假設您在登錄後打開終端窗口。 - Arjan