Yosemite’de launchctl ile arka plan programı başlatılamıyor


27

~/Library/LaunchAgentsMavericks'te işe yarayan lansmanlı bir servistim var . Ancak Yosemite genel beta sürümünde başlamaz. Daemon plist böyledir (kullanıcı adım darksairUID 501'de)

<?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>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>KeepAlive</key>
    <false/>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>LaunchOnlyOnce</key>
    <false/>
    <key>UserName</key>
    <string>darksair</string>
    <key>ProcessType</key>
    <string>Standard</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

Temelde ~/bin/retrmail.pyher 5 dakikada bir çalışması gerekiyordu .

Yosemite lansmanında 2.0'a yükseltildiğini ve launchctl'nin yeni komutları olduğunu fark ettim. denedim

sudo launchctl kickstart user/501/org.darksair.retrmail

ve dedi ki

Could not find service "org.darksair.retrmail" in domain for uid: 501

Eski okulu da denedim

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

ve dedi ki

/Users/darksair/Library/LaunchAgents/retrmail.plist: Path had bad ownership/permissions

Dosya bana ve personel grubuna aittir. Hem 644 hem de 600 izni aynı hatayı kullanarak denedim.

Peki Yosemite'de fırlatma töreni nasıl başlatılacağını bilen var mı?


GÜNCELLEME: Fırlatma aracısı dosyamın sahip olması gerekiyor gibi görünüyor root:wheel. Boğulduktan sonra denedim.

sudo launchctl load ~/Library/LaunchAgents/retrmail.plist

ve herhangi bir hata vermedi. Ve bence benim deamon düzgün çalışıyor. Bu soruyu açık bırakacağım çünkü başlatılan belgenin, başlatıcı aracı dosyasının arka plan programı çalıştıran kullanıcının sahip olabileceğini açıkça hatırladığımı hatırlıyorum.


GÜNCELLEME2: Hayır düzgün çalışmıyordu. Sadece bir kez koşuldu, ama sanki boşaltılmış gibi.


GÜNCELLEME3: Yosemite public beta 3'e yükselttim ve acentemi bunun için değiştirdim

<?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>org.darksair.retrmail</string>
    <key>ProgramArguments</key>
    <array>
      <string>/Users/darksair/bin/retrmail.py</string>
    </array>
    <key>StartInterval</key>
    <integer>300</integer>
    <key>UserName</key>
    <string>darksair</string>
    <key>EnvironmentVariables</key>
    <dict>
      <key>PATH</key>
      <string>/Users/darksair/Python/bin:/Users/darksair/Python3/bin:/Users/darksair/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
    </dict>
    <key>StandardOutPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
    <key>StandardErrorPath</key>
    <string>/Users/darksair/logs/retrmail.log</string>
  </dict>
</plist>

Bu ajanı yeniden yükledim ve bence şimdi düzgün çalışıyor. Bu soruyu hala açık bırakıyorum çünkü önceki sorunumda neyin yanlış olduğunu bilmiyorum.


Sonuç olarak, bulduğum şey root:wheel, yüklemeyi yapabilmek için hakimin sahibini değiştirmek zorunda olduğum .


Bu Yosemite finalinde çalışıyor mu?
TJ Luoma

@TJLuoma: evet. Pist kök tarafından sahip olduğu sürece: tekerlek.
MetroWind

Yanıtlar:


21

itibaren man launchctl

Kullanıcı başına yapılandırma dosyalarının (LaunchAgents) köküne (/ Library / LaunchAgents'ta bulunuyorsa) veya bunları yükleyen kullanıcının ($ HOME / Library / LaunchAgents konumundaysa) sahip olması gerektiğini unutmayın. Tüm sistem çapındaki ödemeler (LaunchDaemons) root aittir. Yapılandırma dosyalarının grup ve dünya yazarlarına izin vermemesi gerekir. Bu kısıtlamalar, güvenlik nedenleriyle yerine getirilmiştir, çünkü başlatılan bir yapılandırma dosyasına yazılabilirliğin sağlanması, hangi çalıştırılabilir dosyanın başlatılacağını belirlemenizi sağlar.

Düzelt

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist

2
“Ya da kullanıcı onları yüklüyor” <- Bu benim sorunum kısmı.
MetroWind

2
Ben unix bir adam değilim, ama "izinsiz grup ve dünya yazıyor" diyor. Hala okunması gerekebileceğinden, öyle değil mi chmod 644?
Jason

5

Garip bir şekilde sudo, senin derdindi. Kullanarak sudo, artık kendiniz değildiniz, bu yüzden kendi dosyanızın sahibi değildiniz. Kaldır sudo, komutu tekrar et ve çok iyi yüklenmeli. Her şeye felsefi yaklaşım için özür dilerim.


4

Çözüm bulundu.

Bu durumda doğru komut

launchctl bootstrap gui/501 ~/Library/LaunchAgents/retrmail.plist

Ve boşaltmak,

launchctl bootout gui/501 ~/Library/LaunchAgents/retrmail.plist

Neden launchctl loadroot gerektirdiğini bilmiyorum , ama load / unload zaten yine de kullanımdan kaldırıldı.


Man sayfa önyükleme değil önizleme listeler. Sanırım otomatik düzeltme, makinemde önyüklemeye geçişin değişmesinden beri seni yakaladı.
Steve Moser

@MetroWind Alıyorum Yukarıdaki komut ile Code = 112 hatası için alan bulunamadı. tutarlı değil. bir ipucu ?
Parag Bafna

Hala chmod&’ye ihtiyacınız var chownmı?
Itachi

@Itachi, hayır. Varsayılan sahibin ve iznin bırakılması iyi olmalıdır.
MetroWind

@ParagBafna, emin değilim. Belki de kullanıcı kimliğiniz 501 değildir?
MetroWind

3

Bunu da denedik, root kullanıcısına değil, kullanıcı kullanmaya çalışıyorum .plist (yapabilmesi gereken)

$ load ~/Library/LaunchAgents/com.blash.blah.plist
Could not find domain for 

Konsolda oturum açmamışken (benim başımdan) sorunum gibi görünen bu makineye uzaktan kapatıldım - en azından kullanıcı tarafından yönetilen servislerin ana ekranda oturum açması gerekiyor (en azından ben bitirdim Bu başsız bir makine olduğu gibi uzaktan yönetim yoluyla giriş)

IMO, eğer kişisel olarak çalışmasanız da, oturum açmak için kişisel olarak orada olmasanız da:

  • Hesabınızı otomatik olarak giriş yapınız (cevaplardan birinde belirtildiği gibi KullanıcıAdı etiketi olmadan da güvenlik uyarısına dikkat ediniz)

  • Dosya kökünü çeşitli önerilerde belirtildiği gibi alın (önceden olduğu gibi, UserName ile kullanıcının sizin için etkili olması)


2
Çok teşekkür ederim. Cevabında bir çözüm buldum.
18'de

2

İşte aptalca bir fikir.

Ben de aynı hatayı gördüm, ayrıca Yosemite’e geçtikten sonra. Yanlışlıkla .plist dosyasındaki kötü sahiplik / izinler anlamına geldiğini, aslında nedense pistte referans gösterdiğim ikilinin (benim durumumda cassandra) yürütülebilir bitini kaybettiğini varsaydım.

chmod + x'ing bunu düzeltti.

Muhtemelen senin sorunun değil, ama bir şansa değer olabilir :)


Bu benim durumum için geçerli değil. Çalıştırılabilir dosyamda x izin biti var. Ama yine de cevap için teşekkür ederim. Umarım başkalarına yardımcı olabilir.
MetroWind

2

UserNameAnahtarı ve dizeyi çıkarın .

Mesele şu ki, UserNameanahtar sadece işlem root tarafından başlatılmışsa kullanılabilir. Sadece pist root'a aitse, root olarak başlatılabilir. Temel olarak, işlem root tarafından başlatılır ve ardından belirtilen kullanıcıya verilir. Bu işlemin kendin gibi çalışmasını istiyorsan, plist'i ~ / Library / LaunchAgents klasörüne koy ve UserName anahtarını kaldır.


Zabbix_agend için 'UserName' seçeneğini kaldırdıktan sonra çalışıyor. Teşekkür ederim! - gist.github.com/chusiang/04db38f5173784e33b68
Chu-Saing Lai

Garip… "KullanıcıAdı" olayını kaldırdıktan sonra hala
yüklenmiyor

1

Kullanıcı izinlerine sahip bir aracıyı manuel olarak yeniden yüklemeye mi çalışıyordunuz? Bunlardan herhangi birinin neden gerekli olduğunu tam olarak anlamadım, ancak kullanıcı etki alanınıza (kök olarak çalıştırdığınızda bağlı olmadığınız görülüyor) bağlanmanız gerektiğine inanıyorum. Yeniden bağlamak için bu işlevleri kullanmak benim için çalıştı.

function as_user {
    local user="$1"
    local user_pid=$(ps -axj | awk "/^$user / {print \$2;exit}")
    local command="sudo launchctl bsexec $user_pid sudo -u '$user' $2"
    echo "Running:"
    echo "$command"
    eval $command
}

function as_current_user {
    as_user "$(whoami)" "$*"
}

function reload_agent {
    as_current_user launchctl unload "$1"
    as_current_user launchctl load "$1"
}

Bunu aşağıdaki gibi kullanırsınız:

reload_agent ~/Library/LaunchAgents/com.hw.helloworld.plist

Bsexec sizi etki alanınıza geri getirir ve görevi bir kullanıcı özniteliği olarak eklemenizi sağlar.


Diyor ki: /Users/darksair/Library/LaunchAgents/retrmail.plist: Operasyon devam ediyor. Bu noktada benim sorularım temelde: Kickstart komutu neden işe yaramadı? Ve neden hak sahibi mülkiyeti root olarak ayarlamak zorundayım…?
MetroWind

1
Plist dosyanızın sahibini root olarak ayarlamamalısınız; ~ / Library / LaunchAgents öğesindeki her şey, bu dizinin ait olduğu kullanıcıya ait olmalıdır. İşlemi daha önce başlattım, komutunu yüklemeden önce kaldırmadım. Sağladığım işlevi kullanıyor musunuz?
imalison

Evet. İşlevlerini kullanıyordum. Ve ilk önce
ihmali

Az önce sağladığınız ilk adımı yüklemeyi denedim ve bu benim için çalıştı. Dosya için hangi izinler belirlenmiş?
imalison

Bu, pek çok şey için inanılmaz bir kod parçasıdır. Güvenlik denetim oturumu veya kullanıcı etki alanı çok yaygın olmadığı için birçok farklı macOS aygıtını yönetmek için kukla ve özel bash betiği karışımı kullanıyorum. Harika iş!
Andrew White
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.