Giriş klasöründe saklanan girişte bash betiği çalıştırılsın mı?


19

Bir LaunchAgent plist'i yüklemeye çalıştığımda launchctlana dizinde bir komut dosyasının nasıl çalıştırılacağını bulamıyorum.

Kodum:

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

Ben bash ile ve bash olmadan ve yerine ~ile denedim $HOME. Ben de çalışmadan kullanmayı denedim bash -c.

Hata kodu:

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

/Users/name/script.sh tam yolunu koymayı deneyin (Ayrıca komut dosyasını çalıştırılabilir ve ilk satır #! / Bin / bash ile ve doğrudan çalıştırırım)
user151019

Birden çok hesap ve bilgisayarda kullanılabileceği için tam yolu kullanamıyorum.
Tyilo

1
Birden fazla hesabım kullanılacaksa, her kullanıcının $ HOME'da birden çok kopyasını yapmak yerine / usr / local / bin / dizinine koymalısınız. Bu senaryo ile neyi başarmaya çalıştığınızı bilmek faydalı olacaktır. Bir LoginHook, IMO için bir iş gibi geliyor.
TJ Luoma

Yanıtlar:


14

EnableGlobbingiçin tilde ve joker karakter genişletmeyi etkinleştirir ProgramArguments:

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

O etkilemez Programveya WatchPathsgenişleme çalışır ancak tilde, WatchPathsvarsayılan olarak.


Bunu yapmanın daha iyi bir yolu bu. LaunchAgent plist'teki anahtarların belgelerini görüntüleyebileceğiniz bir yer var mı?
Tyilo

adam launchd.plist. Veya bu blog gönderisine veya web siteme bakın .
Lri

1
Bu da bana yardımcı oldu. Aşağıdaki Mac OS X Sürümlerinde denendi: 10.7, 10.8 ve 10.9.
Dj S

6
Lütfen dikkat: Bu özellik Yosemite ( Mac OS X 10.10+) içinde kaldırılmıştır .
alex gray

Görünüşe göre 10.9.5'te değil
ocodo

18

EnableGlobbing , OS X Yosemite 10.10 üzerinde çalışmaz . Onaylanmadı ( ref ).

Günlüklerde görebilirsiniz The EnableGlobbing key is no longer respected. Please remove it.(itibaren /var/log/system.log)

Sorun launchdcwd (geçerli çalışma dizini) olmasıdır /, bu yüzden ./bazı insanlar dedi gibi kullanamazsınız .

Evinizden bir komut dosyası çalıştırmak için basit yolu kullanmaktır (bash|zsh|sh) -c. seçeneği. Bu şekilde tilde ~veya $HOMEdeğişkeni kullanma olanağına sahip olacaksınız .

<?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
İle tilde kullanabileceğinizi sanmıyorum sh; Bash, söz konusu olduğunda sh, birçok Bash uzantısını devre dışı bırakan POSIX uyumluluk modunda çalışır.
Üçlü

~/gobbling desteklenmiyor. Bunun ./yerine, arka plan programı kullanıcıların ev kütüphanesine kaydedildiği sürece kullanabilirsiniz . ( ~/Library/LaunchAgents)
Bruno

9

Bunu yaparken bulduğum en güvenilir kullanarak shve HOMEçevre değişkeni oldu:

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

Not: tırnak işaretleri gereklidir.


2

Komut dosyasının neden kullanıcının ana dizininden çalıştırılması gerektiğini bilmek faydalı olacaktır. Komut dosyası için kullanıcının kısa adına ihtiyacınız varsa, onu komut dosyasına bir değişkene atayarak alabilirsiniz.

user=`whoami`

Sonra $userkomut dosyasında kullanın .

Komut dosyasını bir giriş dizininden başka bir yere koyardım, aynı bilgisayardaki diğer kullanıcılar tarafından erişilebilir. Paylaşılan dizini kullanabilir veya komut dosyasını / Library / Scripts /

Launchd plist için tam yolu kullanmanız gerekecek. Ayrıca, launchd plist'inizde <string>bash</string>senaryoda shebang olması ve yürütülebilir olması gerektiği gibi belirtmeniz gerekmez.


Gerçekleştirilecek bashgerçek komut olarak belirtmek , gerçek bir zarar vermeden iyi bir geri dönüştür. Mesele yoksa veya komut dosyasını yürütülebilir yapmayı unutmazsa (o = rwx), bash yine de komut dosyasını çağırır / çalıştırır.
Jason Salaz

1
Kullanıcı adı için $ USER veya $ LOGNAME gibi bir değişken olması gerekir. Ayrıca, paylaşılan Unix komut dosyalarının olağan konumu / usr / local / bin / olacaktır (bunları başka bir yere koyamayacağınız için değil, / usr / local / bin / büyük olasılıkla zaten $ PATH değerinde olacaktır).
TJ Luoma

Whoami kullanmak, $ USER veya $ LOGNAME ile aynı bilgiye ulaşmanın başka bir yöntemidir. Yukarıdaki yerleri önerdim çünkü soru soranların hiçbirini tahmin etmek istemedim. Ayrıca, launchd plist'in çalışmasını denemeden önce, komut dosyasının aslında CLI'den çalışabilmesi gerekir.
afragen

1

Yürütülebilir mi?

chmod 700 ~/script.sh

Terminalde. Ayrıca, $ HOME veya ~ değil, dosyanın gerçek yolunu kullanmak istiyorum.

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

Downvote'un nedeni nedir?
TJ Luoma

1

Komut dosyanız bir kullanıcı aracısıysa (ve bu nedenle Giriş klasörünün kütüphanesinde bulunursa), launchdgeçerli çalışma dizini Giriş klasörüdür. UNIX, yolda bir nokta bulunan giriş dizinini ifade eder.

Temel olarak, ./script.shyerine kullanın ~/script.sh. ;-)


3
Hayır, launchd'ın çalışma dizini aslında /'~' değil.
Tyilo

@Tyilo Ne demek istediğinden emin değilim. "Launchd'un çalışma dizini köktür, her durumda - kullanıcı modunda bile" demek istiyorsan, lütfen bir referans sağla. "Launchd tilde yerine eğik çizgi kullanıyor" demek istiyorsanız, yazımı tekrar okuyun. Bu arada, launchd'de zamanlanmış birkaç komut dosyası var ve tanımladığım davranışı izliyorlar. ;-)
Constantino Tsarouhas

1
@RandyMarch ben bir fırlatma ajan yapılan ~/Library/LaunchAgentsargümanlarla: sh, -c, echo $HOME > /Users/Tyilo/launchd_home.txt. Ne zaman dosya koştu /Users/Tyilo/launchd_home.txtiçeriyordu /değil /Users/Tyilo.
Tyilo
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.