Bagaimana cara menjalankan perintah launchd sebagai root

32

Saya memiliki perintah launchctl berikut sebagai file .plist. Ini dimuat dan diatur untuk berjalan sekali sehari tetapi, perlu dijalankan sebagai root dan saya tidak yakin bagaimana memverifikasi ini.

Juga, tugas cron ini pada dasarnya CD ke direktori dan menjalankan perintah. Saya yakin launchd memiliki cara yang lebih baik untuk menentukan direktori di mana ia seharusnya menjalankan perintah.

Bagaimana saya tahu itu dijalankan sebagai root dan apakah ada cara yang lebih baik untuk menulis ini?

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>dev.project.frontpage.feedparser</string>
    <key>ProgramArguments</key>
    <array>
        <string>cd</string>
        <string>/Users/eman/src/project/trunk/includes/;</string>
        <string>./feed-parser.php</string>
        <string>-c</string>
        <string>./feed-parser-config.xml</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>12</integer>
        <key>Minute</key>
        <integer>0</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>
Emmanuel Mwangi
sumber

Jawaban:

46

Folder apa yang .plistdisimpan?

launchdmenjalankan Daemon ( /Library/LaunchDaemonsatau /System/Library/LaunchDaemons) sebagai root, dan akan menjalankannya terlepas dari apakah pengguna masuk atau tidak. Peluncuran Agen ( /Library/LaunchAgents/atau ~/Library/LaunchAgents/) dijalankan ketika pengguna masuk sebagai pengguna itu. Anda tidak dapat menggunakan setuid untuk mengubah pengguna yang menjalankan skrip pada daemon.

Karena Anda ingin menambahkannya, /Library/LaunchDaemonsAnda ingin memastikan Anda memuatnya launchddengan hak administrator (mis. sudo launchctl load -w /Library/LaunchDaemons/com.apple.samplelaunchdscript.plist)

Lihat man launchdinformasi lebih lanjut.

Chealion
sumber
Terima kasih. Ini persis apa yang saya cari sejauh menjawab masalah root. Script ada di / Library / LaunchDaemons sehingga sudah berjalan sebagai root
Emmanuel Mwangi
Pertanyaan pemula: apakah launchctldiperlukan menjalankan untuk menginstal daemon? Maksud saya, bukankah cukup untuk menyalin file plist ke jalur yang sesuai?
Claudix
@Claudix: Benar. Menyalin konfigurasi launchd pada tempatnya tidak cukup - Anda masih harus "menyalakannya" (launchctl load)
Chealion
4

Sudahkah Anda mencoba menggunakan salah satu editor launchd?

Untuk memastikan itu dijalankan sebagai root, saya cukup yakin launchd akan menjalankan program sebagai root. Pernah berpikir untuk memberikan kepemilikan skrip ke root menggunakan chmod? Dengan cara ini, itu tidak akan berjalan kecuali dijalankan sebagai root. Anda kemudian perlu memverifikasi bahwa itu berjalan.

sudo chown root:admin script_to_run_by_launchd
hanleyp
sumber
Saya menggunakan Lingon untuk menulis skrip ini. Dan saya bisa memastikan itu berfungsi dengan baik di Leopard.
Emmanuel Mwangi
3

Daftar properti di LaunchAgents juga berfungsi, tetapi Anda harus memuat kedua agen dan daemon dengan sudo:

sudo chown root /Library/LaunchAgents/test.plist
sudo launchctl load /Library/LaunchAgents/test.plist

Jika plist tidak memiliki kunci yang dinonaktifkan, itu dimuat pada login berikutnya atau restart secara default, dan -wtidak perlu.

Catatan Teknis TN2083: Daemon dan Agen :

Daemon adalah program yang berjalan di latar belakang sebagai bagian dari keseluruhan sistem (yaitu, ia tidak terikat dengan pengguna tertentu). Daemon tidak dapat menampilkan GUI apa pun; lebih khusus, itu tidak diperbolehkan untuk terhubung ke server jendela.

[...]

Agen adalah proses yang berjalan di latar belakang atas nama pengguna tertentu. Agen berguna karena mereka dapat melakukan hal-hal yang tidak bisa dilakukan daemon, seperti mengakses direktori home pengguna atau terhubung ke server jendela.

Lri
sumber
3

Untuk Googler yang ingin menjalankan Agen Peluncuran khusus dengan hak akses root sebagai bagian dari Daemon Peluncuran , hal itu dapat dilakukan dengan:

  • Buat LaunchAgent Anda di ~/Library/LaunchAgents
  • Jalankan aplikasi Anda dengan sudovia ProgramArgumentsproperti di plist Anda
  • Tetapkan NOPASSWDopsi untuk aplikasi Anda di/etc/resolvers.d

Untuk lebih detail, lihat ini dan jawaban ini .

Cory Klein
sumber
2

LaunchControl membuatnya tidak menyakitkan bagi saya di Yosemite. Ini memiliki GUI drag-n-drop yang bagus untuk membantu Anda membuat atau mengedit layanan. Mengejutkan melihat semua layanan berjalan yang tidak saya ketahui.

Tangga

  1. Mulai LaunchControl
  2. Kiri atas ubah menjadi GlobalDeamons dan masukkan kata sandi admin Anda
  3. File-> Baru
  4. Di bawah label, berikan nama yang unik. Konvensi adalah "com.company.appname"
  5. Di bawah Program untuk menjalankan gunakan skrip Unix Shell atau perintah apa pun yang Anda inginkan TANPA argumen
  6. Jika aplikasi Anda memerlukan argumen, ubah bidang tarik turun dari "Argv default" ke "Argv khusus"
    1. sekarang berikan argumen Anda akan normal seperti Anda akan menjalankannya dari baris perintah yang sebenarnya.
  7. Jalankan di Muat adalah opsional, Anda yang memutuskan.
  8. Dari sisi kanan, seret dan lepas StartInterval dan atur interval yang Anda inginkan. FAQ di bawah menu Bantuan sangat bagus.
Jose Leon
sumber
Bisakah Anda mengedit posting Anda untuk memasukkan langkah-langkah yang dapat dilakukan penanya untuk menyelesaikan masalah mereka?
Cfinley