←→ 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/>
AnahtarEtkisiGö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) demektirHer yeniden başlatmadan sonra oradadır
KeepAlive = trueİşlem her sonlandığında onu yeniden başlatırZorla çıkmak işe yaramaz; saniyeler içinde geri gelir
Koşullu KeepAliveYalnızca bazı durumlarda yeniden başlatır; örneğin bir çökmeden sonra (SuccessfulExit = false) veya ağ bağlıykenHer zaman değil, bazen geri gelir
StartIntervalHer N saniyede bir çalışırBelirir, kısa süre çalışır, kaybolur, tekrarlar
StartCalendarIntervalcron gibi belirli zamanlarda çalışırHer gün aynı saatte belirir
WatchPathsBir dosya veya klasör değiştiğinde çalışırAlakası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

Hangisi olduğunu bulun

  1. İşin etiketini bulun. Uygulamanın veya geliştiricinin adının bir kısmıyla launchctl list | grep -i example komutunu çalıştırın. Üçüncü sütun etikettir.
  2. İşi okuyun:
    launchctl print gui/$(id -u)/com.example.helper
    path (plist dosyası), state, runs (kaç kez başladığı) ve last exit code değerlerine bakın. Yüksek bir çalıştırma sayısı genellikle KeepAlive anlamına gelir.
  3. plist dosyasını açın ve RunAtLoad, KeepAlive ile aralık anahtarlarını denetleyin.
  4. Hiçbir iş yoksa Girişte Aç'ı ve uygulamanın kendi ayarlarını denetleyin.

Durdurmak ve devre dışı bırakmak

Ne yaparsınızGeri gelir mi?
İşlemden çıkmak veya zorla çıkmakEvet: 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 + bootoutHayır, siz launchctl enable çalıştırana kadar
plist dosyasını LaunchAgents dışına taşımak + bootoutHayır, siz geri taşıyana kadar
Arka Planda İzin Ver'de kapatmakHayı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.