Jalankan skrip bash saat login disimpan di folder rumah?


18

Ketika saya mencoba memuat daftar LaunchAgent dari launchctlsaya tidak dapat menemukan cara menjalankan skrip di direktori home.

Kode saya adalah:

<?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>ProgramArguments</key>
    <array>
        <string>bash</string>
        <string>~/script.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

Saya telah mencoba keduanya dengan dan tanpa bash dan juga mengganti ~dengan $HOME. Saya juga sudah mencoba menggunakannya bash -ctanpa berfungsi.

Kode kesalahan adalah:

`com.tyilo.test: bash: ~/script.sh: No such file or directory`

Cobalah menempatkan path lengkap misalnya /Users/name/script.sh (Juga saya akan membuat script executable dan dengan baris pertama # / bin / bash dan menjalankannya secara langsung!)
Mark

Saya tidak dapat menggunakan path lengkap karena akan digunakan pada banyak akun dan komputer.
Tyilo

1
Jika ingin digunakan beberapa akun saya maka Anda harus meletakkannya di / usr / local / bin / daripada membuat banyak salinan di $ HOME masing-masing pengguna. Akan sangat membantu untuk mengetahui apa yang ingin Anda capai dengan skrip ini. Kedengarannya seperti pekerjaan untuk LoginHook, IMO.
TJ Luoma

Jawaban:


13

EnableGlobbingmemungkinkan ekspansi tilde dan wildcard untuk ProgramArguments:

<key>EnableGlobbing</key>
<true/>
<key>ProgramArguments</key>
<array>
    <string>say</string>
    <string>~/*</string>
</array>

Itu tidak mempengaruhi Programatau WatchPaths, bagaimanapun tilde ekspansi berfungsi WatchPathssecara default.


Ini cara yang lebih baik untuk melakukan ini. Apakah ada tempat di mana Anda dapat melihat dokumentasi untuk kunci dalam daftar LaunchAgent?
Tyilo

man launchd.plist. Atau lihat posting blog ini atau situs web saya .
Lri

1
Ini membantu saya juga. Mencoba dalam Versi Mac OS X berikut: 10.7, 10.8, dan 10.9.
Dj S

6
Harap dicatat: Fitur ini telah dihapus di Yosemite ( Mac OS X 10.10+).
alex grey

Sepertinya juga tidak di 10.9.5
ocodo

17

EnableGlobbing tidak berfungsi di OS X Yosemite 10.10 . Sudah usang ( ref ).

Anda dapat melihat log The EnableGlobbing key is no longer respected. Please remove it.(dari /var/log/system.log)

Masalahnya adalah bahwa launchdcwd (direktori kerja saat ini) adalah /, jadi Anda tidak dapat menggunakan ./seperti yang dikatakan beberapa orang.

Untuk menjalankan skrip dari rumah Anda, cara sederhana adalah menggunakan (bash|zsh|sh) -c. pilihan. Dengan cara ini Anda akan memiliki kemampuan untuk menggunakan tilde ~atau $HOMEvariabel.

<?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>org.your.stuff</string>
    <key>ProgramArguments</key>
    <array>
      <!-- here is the important thing -->
      <string>zsh</string>
      <string>-c</string>
      <string>~/you/script/in/your/home</string>
    </array>

    <!-- code below is just for the example -->
    <!-- Keep running... -->
    <key>KeepAlive</key>
    <true />
    <!-- ...every day. In sec, 60*60*24 = every day -->
    <key>ThrottleInterval</key>
    <integer>86400</integer>
  </dict>
</plist>

2
Saya tidak berpikir Anda bisa menggunakan tilde dengan sh; ketika Bash terlibat sh, Bash berjalan dalam mode kompatibilitas POSIX, yang menonaktifkan banyak ekstensi Bash.
tripleee

~/sedang melahap jadi tidak didukung. Anda dapat menggunakannya ./sebagai gantinya selama daemon disimpan di perpustakaan rumah pengguna. ( ~/Library/LaunchAgents)
Bruno

8

Yang paling dapat diandalkan yang saya temukan untuk melakukan ini adalah dengan menggunakan shdan HOMEvariabel lingkungan:

<?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>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>-c</string>
        <string>"$HOME/script.sh"</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>Label</key>
    <string>com.tyilo.test</string>
</dict>
</plist>

Catatan: tanda kutip diperlukan.


2

Akan sangat membantu untuk mengetahui mengapa skrip perlu dijalankan dari direktori home pengguna. Jika Anda memerlukan nama pendek pengguna untuk skrip, Anda bisa mendapatkannya dengan menetapkannya ke variabel seperti pada

user=`whoami`

Kemudian gunakan $userdalam skrip.

Saya benar-benar akan meletakkan skrip di tempat lain selain direktori home, lalu dapat diakses oleh pengguna lain di komputer yang sama. Anda bisa menggunakan direktori Shared atau meletakkan skrip di / Library / Scripts /

Anda harus menggunakan path lengkap untuk daftar launchd. Juga, dalam daftar launchd Anda, Anda tidak perlu menentukan <string>bash</string>karena Anda harus memiliki shebang dalam skrip dan itu harus dieksekusi.


Menentukan bashsebagai perintah yang sebenarnya untuk dieksekusi adalah mundur yang baik tanpa kerugian nyata. Jika ia tidak memiliki shebang, atau lupa membuat skrip dapat dieksekusi (o = rwx), maka bash masih akan memanggil / mengeksekusi skrip.
Jason Salaz

1
Seharusnya sudah ada variabel untuk nama pengguna, seperti $ USER atau $ LOGNAME. Selain itu, lokasi yang biasa untuk skrip Unix yang dibagikan adalah / usr / local / bin / (bukan berarti Anda tidak dapat menempatkannya di tempat lain, tetapi / usr / local / bin / kemungkinan besar sudah berada dalam $ PATH Anda).
TJ Luoma

Menggunakan whoami hanyalah metode lain untuk mendapatkan info yang sama dengan $ USER atau $ LOGNAME. Saya menyarankan lokasi di atas karena saya tidak ingin menganggap apa pun dari si penanya. Juga, sebelum mencoba membuat launchd plist berfungsi, skrip sebenarnya harus dapat dijalankan dari CLI.
afragen

1

Jika skrip Anda adalah agen pengguna (dan dengan demikian terletak di perpustakaan folder Home), launchddirektori kerja saat ini adalah folder Home. UNIX merujuk ke direktori home dengan titik di path.

Jadi pada dasarnya, gunakan ./script.shsaja ~/script.sh. ;-)


3
Tidak, direktori kerja launchd sebenarnya /, bukan '~'.
Tyilo

@ Tyilo Saya tidak yakin apa yang Anda maksud. Jika Anda maksudkan "direktori kerja launchd adalah root, dalam semua kasus — bahkan dalam mode pengguna", harap berikan referensi. Jika maksud Anda "launchd menggunakan garis miring alih-alih tilde", baca posting saya lagi. Ngomong-ngomong, saya memiliki beberapa skrip yang dijadwalkan di launchd dan mereka mengikuti perilaku yang saya jelaskan. ;-)
Constantino Tsarouhas

1
@RandyMarch saya membuat agen peluncuran di ~/Library/LaunchAgentsdengan argumen: sh, -c, echo $HOME > /Users/Tyilo/launchd_home.txt. Saat menjalankan file /Users/Tyilo/launchd_home.txtberisi /, tidak /Users/Tyilo.
Tyilo

0

Apakah ini dapat dieksekusi?

chmod 700 ~/script.sh

di Terminal. Juga, saya tidak akan menggunakan $ HOME atau ~ melainkan path sebenarnya ke file.

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

Apa alasan downvote?
TJ Luoma
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.