Giriş macunda komut dosyası çalıştırılıyor [kapalı]


280

Bilgisayarımda hesabıma giriş yaptığımda bir .sh dosyası almak konusunda bana yardımcı olup olamayacağını merak ediyorum. Mac OS X 10.6.7 kullanıyorum.

Bilgisayarımda oturum açtığımda çalıştırmak istediğim bir dosya "Örnek.sh" var. Zaten oturum açtığımda çalıştırırken bir sorunum yok, ancak bunun otomatik olarak çalışmasını istiyorum.

İnsanlar giriş kabuğu dosyasına eklemek için söylüyorlar, ama bunun nerede olduğunu bilmiyorum. Biraz yardım lütfen.


3
Bu konu dışı değil ... Benim Emacs daemon başlatmak için gerekli;) BTW en iyi cevap IMHO Lingon X uygulaması.
HappyFace

1
Bunun konu dışı olması umurumda değil. İnternette bulduğum en iyi cevap ve saygıyı hak ediyor. Ben ilk kez bir çözüm arayan diğerleri için görmezden geldi ve bu büyük bir hataydı!
Sethmr

Yanıtlar:


379

Bunu takip et:

  • Başlat Automator.app
  • seçmek Application
  • Show libraryaraç çubuğunu tıklayın (gizli ise)
  • ekleyin Run shell script(dan Actions/Utilities)
  • komut dosyanızı kopyalayıp pencereye yapıştırın
  • Dene
  • yere kaydetme (bir yapabilirsiniz örneğin Applicationsevinizdeki klasörü, bir alacak your_name.app)

  • gidin System Preferences-> Accounts->Login items

  • bu uygulamayı ekle
  • test ve yapıldı;)

DÜZENLE:

Kısa süre önce bu cevap için "İyi cevap" rozeti kazandım. Çözümüm basit ve çalışıyor olsa da, herhangi bir programı veya kabuk komut dosyasını oturum açma sırasında çalıştırmanın en temiz yolu @ trisweb'in cevabında açıklanmaktadır , eğer etkileşim istemiyorsanız .

Automator çözümü ile bir sonraki gibi işler yapabilirsiniz: automator ekran görüntüsü giriş uygulaması

bu nedenle, bir komut dosyası çalıştırmayı veya uygulamadan çıkmayı, parola sormayı, giriş sırasında diğer otomator iş akışlarını çalıştırmayı, giriş zamanında koşullu olarak uygulamaları çalıştırmayı vb.


2
@GregMiernicki LOL, günaydın ...;) Neredeyse bir yıl önce cevabımı bir EDIT ekledi, burada da söylüyorum. Ancak, bu ortalama kullanıcılar için biraz daha basittir, çünkü XML (plist) dosyaları oluşturmak birçok kullanıcı için çok kullanıcı dostu değildir. Neyse - bir yorum için teşekkürler. ;)
jm666

4
@GregMiernicki ve unutmayın, Automator çözümü ile ETKİLEŞİMLİ giriş komut dosyaları yapabilirsiniz - örn. Sizden bazı girişler isteyecek bir komut dosyası (örn. Ek şifre veya benzeri). Dünya sadece siyah ya da beyaz değil - en azından bir zebra gibi ... :) :)
jm666

2
@Cupidvogel Giriş zamanında bir daemon çalıştırmak tam olarak launchd çözümü için bir iştir - trisweb'in cevabına bakın. Bir python arka plan programı yönetebiliyorsanız, yeniden başlatmaların tüm yönlerini yönetebileceğiniz bir plist yapılandırma dosyasını yönetebilirsiniz ...
jm666

3
Diğer cevabı en temiz olarak işaret ettiği için şeref. Bu iyi bir vatandaşlık rozeti almalı :).
studgeek

2
Şaşırtıcı cevap. Sistem başlangıcında "composer global update" gibi komutları çalıştırmak istiyorsanız, komut dosyasının başında PATH = / usr / local / bin: $ PATH dosyasını dışa aktarın.
Leonardo

377

tl; dr: OSX'in yerel işlem başlatıcısını ve yöneticisini kullanın launchd,.

Bunu yapmak için bir launchctlarka plan programı yapın. Senaryonun tüm yönleri üzerinde tam kontrole sahip olacaksınız. Bir kez koşabilir veya bir daemon olarak hayatta kalabilirsiniz. Çoğu durumda, bu yol.

  1. Apple Dev dokümanlarındaki talimatlara veya aşağıdaki daha fazla ayrıntıya .plistgöre bir dosya oluşturun .
  2. Yerleştirmek ~/Library/LaunchAgents
  3. Giriş yapın (veya üzerinden manuel olarak çalıştırın launchctl load [filename.plist])

Daha fazla bilgi için launchd, wikipedia makalesi oldukça iyi ve sistemi ve diğer eski sistemlere göre avantajlarını açıklıyor.


İşte oturum açma sırasında bir komut dosyası çalıştırmak için belirli plist dosyası .

OSX El Capitan ve daha yeni sürümler için 2017/09/25 güncellendi ( José Messias Jr'a kredi ):

<?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>com.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Değiştir <string>(: bu komutla başvuruda bulunduğu komut çalıştırılabilir olması gerektiğini not istediğiniz komutla Programı anahtarının sonra chmod a+x /path/to/executable/script.shtüm kullanıcılar için olduğundan emin olmak için).

Farklı kaydet ~/Library/LaunchAgents/com.user.loginscript.plist

launchctl load ~/Library/LaunchAgents/com.user.loginscript.plistTest etmek (veya doğrudan test etmek, çalıştırmak launchctl start com.user.loginscript) için çalıştırın ve oturumu kapatın / oturum açın

/var/log/system.logHata mesajlarının kuyruğu .

Anahtar, bunun Kullanıcıya özel bir başlatma girişi olmasıdır, bu nedenle belirli bir kullanıcı için oturum açıldığında çalıştırılacaktır. Sisteme özgü başlatma cinleri (yerleştirilmiş /Library/LaunchDaemons) önyükleme sırasında çalıştırılır.

Bir komut dosyasının tüm kullanıcılar için oturum açmada çalışmasını istiyorsanız, sanırım LoginHook tek seçeneğinizdir ve muhtemelen bunun nedeni de budur.


4
Evet. FWIW Bu blogu aynı teknikte yararlı buldum: developernotes.com/archive/2011/04/06/169.aspx
Daniel James

8
Automator eylemleri hakkında neyin şüpheli olduğunu ve neden 'önerilmediklerini' belirtmeyi ihmal ediyorsunuz.
Mike Campbell

4
Klasör eylemleri ve launchctl hakkında iyi bir genel bakış: apple.stackexchange.com/a/63731/38290 - Ve LoginHook'un sınırlamalarından biri hakkında başka bir tane (sadece bir komut dosyasına izin verilir) - superuser.com/a/377401 . Ya şüpheli ya da kötü bir yöntem değil, ama launchctlçoğu durumda çok daha iyi ve senaryonuzu çalıştırmanın tüm olası yönleri üzerinde daha fazla kontrol sağlıyor. Daha çok "neden başlatma olduğunda daha az yetenekli bir yöntem kullanalım?" (Not: İlk cümleyi, bu durumu kişisel olarak önermediğimi belirtmek için değiştirdim ).
trisweb

3
LaunchDaemon plist'i nasıl oluşturacağınızı merak ediyorsanız , kullanıcı oturum açtığında her şey ne olacak ? . Yani, sistem önyüklendiğinde değil , kullanıcı oturum açtığında her zaman (oturum kapatma oturumunu deneyin). Göstermek misiniz tam olarak (sizin tarafınızdan yanlış) Yukarıdaki launchctl ile otomatikçisi çözümü nasıl (sadece bla-bla)?
Cajwine

9
/ Library / LaunchAgents / içindeki liste dosyaları , oturum açmış olan kullanıcının kimliğiyle oturum açıldığında çalıştırılır. / Library / LaunchDaemons / içindeki listeleme dosyaları önyükleme sırasında root olarak çalıştırılır (id, Kullanıcı tuşu ile değiştirilebilir ).
bain

42
  1. Kabuk komut dosyanızı login.sh$ HOME klasörünüzde olduğu gibi oluşturun .

  2. Aşağıdaki tek satırlık komut dosyasını Komut Dosyası Düzenleyicisi'ne yapıştırın:

    kabuk komut dosyası "$ HOME / login.sh"

  3. Sonra bir uygulama olarak kaydedin.

  4. Son olarak uygulamayı giriş öğelerinize ekleyin.

Komut dosyası çıktısını görsel yapmak istiyorsanız, bunun için 2. adımı değiştirebilirsiniz:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

Birden fazla komut gerekiyorsa, bunun gibi bir şey kullanılabilir:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell

1
Ben bu bir, bir komut satırı yükleyici eksik tek şey;)
sorin

1
Güzel çözüm. "Giriş" penceresini nasıl gizleyebilirim? Giriş öğelerini tıklamayı denedim.
xgdgsc

1
@xgdgsc: Go to System Preferences -> Accounts -> Login itemsBu uygulama için gizle kutusunu işaretleyin ve işaretleyin.
anubhava

1
@anubhava Dediğim gibi, bu giriş uygulaması için gizleme kutusunu zaten işaretledim. Ancak yine de bilgisayarı kapatırken görünmeye ve çıkmaya zorlanması gerekir.
xgdgsc

2
@xgdgsc: Oh tamam, ~/Library/LaunchAgentsklasörü kontrol ettin mi?
anubhava
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.