←→ Underneath: Background Apps · Tüm Mac rehberleri
Mac'inizi yeniden başlattıktan sonra bir uygulama neden geri gelir
Uygulamadan çıktınız. Hatta Etkinlik Monitörü'nde zorla çıkış yaptırdınız. İki saniye sonra ya da bir sonraki yeniden başlatmadan sonra yine çalışıyor. Bir şey onu bilerek başlatıyor. Mac'te o şey neredeyse her zaman launchd'dir.
Kısa yanıt: uygulamanın bir launchd işi vardır. RunAtLoad onu her girişte başlatır, KeepAlive ise her durduğunda yeniden başlatır. İşlemden çıkmak işi değiştirmez. Onu kalıcı olarak durdurmak için işlemi değil, işi devre dışı bırakın.
launchd nedir
launchd, macOS'un başlattığı ilk işlemdir (işlem kimliği 1). Neredeyse diğer her şeyi o başlatır. Küçük .plist dosyalarını okur; iş (job) adı verilen bu dosyalar neyin ne zaman çalışacağını söyler. Her işin bir etiketi (label) vardır; com.google.keystone.agent gibi benzersiz bir ad.
Uygulamalar işleri ~/Library/LaunchAgents, /Library/LaunchAgents veya /Library/LaunchDaemons klasörlerine yükler ya da kendi uygulama paketlerinin içinden kaydeder.
Bir uygulamayı geri getiren anahtarlar
Tipik bir başlatma aracısı şöyledir:
<key>Label</key>
<string>com.example.helper</string>
<key>ProgramArguments</key>
<array>
<string>/Applications/Example.app/Contents/MacOS/Helper</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
| Anahtar | Etkisi | Gördüğünüz |
|---|---|---|
RunAtLoad | İşi yüklenir yüklenmez başlatır; bu da her girişte (aracılar) veya her açılışta (daemon'lar) demektir | Her yeniden başlatmadan sonra oradadır |
KeepAlive = true | İşlem her sonlandığında onu yeniden başlatır | Zorla çıkmak işe yaramaz; saniyeler içinde geri gelir |
Koşullu KeepAlive | Yalnızca bazı durumlarda yeniden başlatır; örneğin bir çökmeden sonra (SuccessfulExit = false) veya ağ bağlıyken | Her zaman değil, bazen geri gelir |
StartInterval | Her N saniyede bir çalışır | Belirir, kısa süre çalışır, kaybolur, tekrarlar |
StartCalendarInterval | cron gibi belirli zamanlarda çalışır | Her gün aynı saatte belirir |
WatchPaths | Bir dosya veya klasör değiştiğinde çalışır | Alakasız bir şey yaptıktan sonra belirir |
launchd sürekli sonlanan bir işin yeniden başlatmaları arasında yaklaşık 10 saniye bekler; bu yüzden KeepAlive içeren bir iş “yanıp sönüyormuş” gibi de görünebilir.
Bir uygulamanın geri gelmesinin diğer nedenleri
- Girişte Aç. Uygulama Sistem Ayarları › Genel › Giriş Öğeleri ve Uzantılar bölümündedir. macOS onu her girişte açar.
- Yeniden giriş yapıldığında pencereleri yeniden aç. Yeniden Başlat ve Kapat iletişim kutusundaki bu kutu, açık olan her uygulamayı geri yükler.
- Uygulama kendini yeniden ekler. Kendi “Girişte başlat” ayarı, uygulama her çalıştığında onu yeniden kaydeder.
- Bir yardımcı ana uygulamayı açar. Küçük bir arka plan yardımcısı önce başlar, sonra örneğin eşzamanlama durumunu göstermek için tam uygulamayı açar.
- Homebrew hizmetleri.
brew services start,RunAtLoadiçeren bir başlatma aracısı yazar. Onubrew services stop <name>ile durdurun.
Hangisi olduğunu bulun
- İşin etiketini bulun. Uygulamanın veya geliştiricinin adının bir kısmıyla
launchctl list | grep -i examplekomutunu çalıştırın. Üçüncü sütun etikettir. - İşi okuyun:
launchctl print gui/$(id -u)/com.example.helperpath(plist dosyası),state,runs(kaç kez başladığı) velast exit codedeğerlerine bakın. Yüksek bir çalıştırma sayısı genellikleKeepAliveanlamına gelir. - plist dosyasını açın ve
RunAtLoad,KeepAliveile aralık anahtarlarını denetleyin. - Hiçbir iş yoksa Girişte Aç'ı ve uygulamanın kendi ayarlarını denetleyin.
Durdurmak ve devre dışı bırakmak
| Ne yaparsınız | Geri gelir mi? |
|---|---|
| İşlemden çıkmak veya zorla çıkmak | Evet: KeepAlive varsa hemen, RunAtLoad varsa sonraki girişte |
launchctl bootout gui/$(id -u)/label | Şimdi değil. RunAtLoad varsa sonraki girişte evet |
launchctl disable gui/$(id -u)/label + bootout | Hayır, siz launchctl enable çalıştırana kadar |
| plist dosyasını LaunchAgents dışına taşımak + bootout | Hayır, siz geri taşıyana kadar |
| Arka Planda İzin Ver'de kapatmak | Hayır, siz yeniden açana kadar |
Adım adım komutlar başlatma aracılarını güvenle devre dışı bırakma rehberindedir.
SSS
Etkinlik Monitörü'nde çıktığım bir işlem neden hemen yeniden başlıyor?
launchd işinde KeepAlive ayarlanmış. launchd işlemi izler ve işlem sonlandığında onu yeniden başlatır. İşlemden çıkmak yerine işi launchctl bootout ile durdurun.
RunAtLoad ne anlama gelir?
RunAtLoad, bir launchd plist dosyasındaki bir anahtardır. Değeri true olduğunda launchd, plist dosyasını yükler yüklemez işi başlatır; bu da bir başlatma aracısı için her giriş yaptığınızda demektir.
KeepAlive ne anlama gelir?
KeepAlive, launchd'ye işi çalışır durumda tutmasını söyler. İşlem sonlanırsa veya sonlandırılırsa launchd onu yeniden başlatır. Yalnızca çökmeden sonra yeniden başlatmak gibi bir koşullar kümesi de olabilir.
Bir başlatma aracısını durdurmakla devre dışı bırakmak arasındaki fark nedir?
Durdurmak (launchctl bootout) işi bir sonraki girişe veya yeniden başlatmaya kadar kaldırır. Devre dışı bırakmak (launchctl disable ya da plist dosyasını LaunchAgents dışına taşımak) ise yeniden başlatmadan sonra yeniden yüklenmesini engeller.