Tidak dapat meluncurkan daemon dengan launchctl di Yosemite

27

Saya memiliki daemon launchd ~/Library/LaunchAgentsyang berfungsi dengan baik di Mavericks. Tetapi itu tidak akan mulai dalam beta publik Yosemite. Daemon plist seperti ini (nama pengguna saya darksairdengan UID 501)

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

Pada dasarnya itu seharusnya berjalan ~/bin/retrmail.pysetiap 5 menit.

Saya perhatikan bahwa di Yosemite launchd ditingkatkan ke 2.0, dan launchctl memiliki perintah baru. Saya mencoba

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

dan katanya

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

Saya juga mencoba sekolah tua

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

dan katanya

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

File ini milik saya dan grup staf. Saya mencoba keduanya 644 dan 600 izin dengan kesalahan yang sama.

Jadi, adakah yang tahu cara menjalankan daemon launchd di Yosemite dengan benar?


PEMBARUAN: Sepertinya file agen peluncuran saya harus dimiliki oleh root:wheel. Setelah saya mengunyah, saya mencoba

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

dan itu tidak mengeluarkan kesalahan. Dan saya pikir deamon saya berjalan dengan baik. Saya akan membiarkan pertanyaan ini terbuka karena saya ingat dokumen launchd dengan jelas menyatakan bahwa file agen peluncuran dapat dimiliki oleh pengguna yang menjalankan daemon.


UPDATE2: Tidak itu tidak berjalan dengan benar. Itu dijalankan hanya sekali, tetapi tidak lagi, seolah-olah itu dibongkar.


UPDATE3: Saya memutakhirkan ke Yosemite public beta 3, dan mengubah agen saya menjadi ini

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

Saya memuat kembali agen ini, dan saya pikir sekarang ini berfungsi dengan baik. Saya masih membiarkan pertanyaan ini terbuka karena saya tidak tahu apa yang salah dengan daftar saya sebelumnya.


Kesimpulannya, apa yang saya temukan adalah saya harus mengubah pemilik plist root:wheeluntuk memuatnya.

MetroWind
sumber
Apakah ini berfungsi di Yosemite final?
TJ Luoma
@TJLuoma: ya. Selama plist dimiliki oleh root: wheel.
MetroWind

Jawaban:

21

Dari man launchctl

Perhatikan bahwa file konfigurasi per pengguna (LaunchAgents) harus dimiliki oleh root (jika terletak di / Library / LaunchAgents) atau pengguna memuatnya (jika mereka berada di $ HOME / Library / LaunchAgents). Semua daemon seluruh sistem (LaunchDaemon) harus dimiliki oleh root. File konfigurasi harus melarang grup dan dunia menulis. Pembatasan ini ada untuk alasan keamanan, karena memungkinkan kemampuan menulis untuk file konfigurasi launchd memungkinkan seseorang untuk menentukan yang dapat dieksekusi akan diluncurkan.

Perbaiki adalah

sudo chmod 600 /Library/LaunchDaemons/x.plist
sudo chown root /Library/LaunchDaemons/x.plist
diimdeep
sumber
2
“Atau pengguna memuatnya” <- Ini adalah bagian yang saya punya masalah.
MetroWind
2
Saya bukan pria unix, tetapi dikatakan "larang grup dan dunia menulis". Karena mungkin masih perlu dibaca, bukankah begitu chmod 644?
Jason
5

Anehnya, menggunakan sudoadalah masalah Anda. Dengan menggunakan sudo, Anda bukan lagi diri Anda sendiri, jadi Anda bukan pemilik file Anda sendiri. Hapus sudo, ulangi perintah dan harus memuat dengan baik. Maaf atas pendekatan filosofis untuk semuanya.

AlexPantea
sumber
4

Menemukan solusinya.

Perintah yang benar dalam hal ini adalah

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

Dan untuk membongkar,

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

Tidak tahu mengapa launchctl loadmemerlukan root, tetapi load / unload sudah tidak digunakan lagi.

MetroWind
sumber
Halaman manual mencantumkan bootout bukan bootcut. Saya pikir koreksi otomatis membuat Anda karena di mesin saya itu mengubah bootout menjadi bootcut.
Steve Moser
@MetroWind Saya mendapatkan Tidak dapat menemukan domain untuk Code = 112 kesalahan dengan perintah di atas. itu tidak konsisten. ada petunjuk?
Parag Bafna
Apakah Anda masih memerlukan chmod&chown ?
Itachi
@ Itachi, tidak. Meninggalkan pemilik default dan izin harus baik-baik saja.
MetroWind
@ ParagBafna, saya tidak yakin. Mungkin UID Anda tidak 501?
MetroWind
3

Berlari ke sini juga, mencoba menggunakan pengguna, bukan root yang dimiliki .plist (seperti yang seharusnya dapat dilakukan)

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

Saya ssh-ed ke mesin ini dari jarak jauh sementara saya TIDAK masuk di konsol (tanpa kepala) yang tampaknya menjadi masalah saya - setidaknya layanan yang dikelola pengguna membutuhkan pengguna untuk masuk ke layar utama (akhirnya saya melakukan masuk melalui remote-manajemen karena ini adalah mesin tanpa kepala)

IMO, jika Anda ingin ini berjalan bahkan jika Anda tidak secara pribadi ada untuk masuk opsi Anda adalah:

  • Buat login akun Anda secara otomatis (perhatikan implikasi keamanan, juga tanpa tag UserName seperti yang tercantum dalam salah satu jawaban)

  • Jadikan file root dimiliki seperti yang tercantum dalam berbagai saran (mengatur agar pengguna kembali ke milik Anda dengan UserName seperti yang sudah Anda miliki)

nhed
sumber
2
Terima kasih banyak. Saya telah menemukan solusi dalam jawaban Anda.
Retraut
2

Ini ide yang konyol.

Saya hanya mengalami kesalahan yang sama, juga setelah ditingkatkan ke Yosemite. Saya keliru mengira itu berarti kepemilikan / izin buruk pada file .plist, padahal, untuk beberapa alasan biner yang saya rujuk dalam daftar (dalam kasus saya cassandra), telah kehilangan bit yang dapat dieksekusi.

chmod + x'ing memperbaikinya.

Mungkin bukan masalah Anda, tetapi mungkin patut dicoba :)

DanielSmedegaardBuus
sumber
Ini tidak berlaku untuk kasus saya. Eksekusi saya memang memiliki bit izin x. Tapi terima kasih atas jawabannya. Semoga bisa membantu beberapa orang lain.
MetroWind
2

Hapus UserName kunci dan string.

Masalahnya adalah bahwa UserNamekuncinya hanya dapat digunakan jika proses dimulai oleh root. Itu hanya dapat dimulai sebagai root jika plist dimiliki oleh root. Pada dasarnya, proses ini dimulai oleh root dan kemudian suid'ed untuk pengguna yang ditentukan. Jika Anda ingin proses ini berjalan seperti diri Anda sendiri, letakkan plist di folder ~ / Library / LaunchAgents Anda dan hapus kunci UserName.

Peter T Bosse II
sumber
Ini berfungsi setelah saya menghapus opsi 'UserName' untuk zabbix_agend. Terima kasih! - gist.github.com/chusiang/04db38f5173784e33b68
Chu-Saing Lai
Aneh ... Masih tidak mau memuat setelah saya menghapus hal "UserName" ...
MetroWind
1

Apakah Anda mencoba memuat ulang agen secara manual yang memiliki izin pengguna? Saya tidak sepenuhnya mengerti mengapa semua ini diperlukan, tetapi saya percaya bahwa Anda harus dilampirkan ke domain pengguna Anda (yang tampaknya Anda tidak terikat ketika Anda menjalankan sebagai root). Menggunakan fungsi-fungsi ini untuk memasang kembali bekerja untuk saya.

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"
}

Anda akan menggunakan ini sebagai berikut:

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

Bsexec menempatkan Anda kembali ke domain Anda, dan memungkinkan Anda menambahkan tugas sebagai agen peluncuran pengguna.

Imalison
sumber
Dikatakan: / Pengguna /dairair/Library/LaunchAgents/retrmail.plist: Operasi sudah berlangsung. Pada titik ini pertanyaan saya pada dasarnya: mengapa perintah kickstart tidak berfungsi? Dan mengapa saya harus mengatur kepemilikan plist menjadi root ...?
MetroWind
1
Anda TIDAK boleh mengatur pemilik file plist Anda menjadi root; semua yang ada di ~ / Library / LaunchAgents harus dimiliki oleh pengguna yang dimiliki oleh direktori tersebut. Saya sudah mendapatkan Operasi yang sedang berjalan ketika saya tidak membongkar perintah sebelum saya memuatnya. Apakah Anda menggunakan fungsi yang saya sediakan?
Imalison
Iya nih. Saya menggunakan fungsi Anda. Dan saya membongkar plist dulu ...
MetroWind
Saya baru saja mencoba memuat plist pertama yang Anda berikan dan itu berhasil untuk saya. Izin apa yang ditetapkan untuk file?
Imalison
Ini adalah potongan kode yang luar biasa untuk banyak hal. Saya menggunakan campuran skrip bash boneka dan kustom untuk mengelola banyak perangkat macOS yang berbeda, dan masalah acak karena sesi audit keamanan atau domain pengguna tidak benar sudah biasa. Kerja bagus!
Andrew White