ログイン時にbashスクリプトをホームフォルダーに保存して実行しますか?


19

LaunchAgent plistをロードしようとするlaunchctlと、ホームディレクトリでスクリプトを実行する方法がわかりません。

私のコードは:

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

私はbashを使用した場合と使用しない場合の両方を試してみまし~$HOME。また、私はbash -cそれが動作せずに使用してみました。

エラーコードは次のとおりです。

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

/Users/name/script.shなどのフルパスを入力してみてください(また、スクリプトを実行可能にし、最初の行を#!/ bin / bashにして直接実行します)
-user151019

フルパスは複数のアカウントとコンピューターで使用されるため、使用できません。
ティロ

1
複数のアカウントを使用する場合は、各ユーザーの$ HOMEに複数のコピーを作成する代わりに、/ usr / local / bin /に配置する必要があります。このスクリプトで何を達成しようとしているのかを知っておくと役立ちます。LoginHook、IMOの仕事のように思えます。
TJ Luoma

回答:


14

EnableGlobbingのチルダとワイルドカードの展開を有効にしますProgramArguments

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

ProgramまたはWatchPathsには影響しませんがWatchPaths、デフォルトではチルダ展開が機能します。


これはこれを行うより良い方法です。LaunchAgent plistのキーのドキュメントを表示できる場所はありますか?
ティロ

man launchd.plist。または、このブログ投稿または私のウェブサイトをご覧ください。
Lri

1
これも助けになりました。次のMac OS Xバージョンで試しました:10.7、10.8、および10.9。
Dj S 14年

6
注:この機能はYosemite(Mac OS X 10.10+)で削除されました。
アレックスグレー

10.9.5でもないようです
オコド

18

EnableGlobbingはOS X Yosemite 10.10では動作しません。廃止されました( ref)。

ログで見ることができますThe EnableGlobbing key is no longer respected. Please remove it.(から/var/log/system.log

問題は、launchdcwd(現在の作業ディレクトリ)が/であるため、./一部の人が言ったように使用できないことです。

自宅からスクリプトを実行するには、単純な方法を使用します(bash|zsh|sh) -c。オプション。これにより、チルダ~または$HOME変数を使用できるようになります。

<?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
チルダを使用できるとは思わないsh。Bashがとして関与している場合sh、POSIX互換モードで実行され、多くのBash拡張機能が無効になります。
トリプリー

~/ゴブリングですので、サポートされていません。./デーモンがユーザーのホームライブラリに保存されている限り、代わりに使用できます。(~/Library/LaunchAgents
ブルーノ

9

これを行うことで私が見つけた最も信頼できるのはshHOME環境変数を使用することでした:

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

注:引用符は必須です。


2

ユーザーのホームディレクトリからスクリプトを実行する必要がある理由を知ることは役立ちます。スクリプトにユーザーの短縮名が必要な場合は、次のように変数に割り当てることで取得できます。

user=`whoami`

次に$user、スクリプトで使用します。

スクリプトをホームディレクトリ以外の場所に配置すると、同じコンピューター上の他のユーザーがスクリプトにアクセスできます。共有ディレクトリを使用するか、スクリプトを/ Library / Scripts /に配置できます

launchd plistのフルパスを使用する必要があります。また、launchd plist <string>bash</string>では、スクリプトにシェバンが必要であり、実行可能である必要があるため、指定する必要はありません。


bash実行する実際のコマンドとして指定することは、実際の障害を伴わない優れたフォールバックです。彼がシバンを持っていない場合、またはスクリプトを実行可能にするのを忘れた場合(o = rwx)、bashは引き続きスクリプトを起動/実行します。
ジェイソンサラズ

1
$ USERや$ LOGNAMEなどのユーザー名の変数が既に存在する必要があります。また、共有Unixスクリプトの通常の場所は/ usr / local / bin /になります(他の場所に配置できないわけではありませんが、/ usr / local / bin /はほとんどの場合既に$ PATHにあります)。
TJルオマ

whoamiを使用することは、$ USERまたは$ LOGNAMEと同じ情報を取得するためのもう1つの方法です。私は質問者を何も推定したくないので、上の場所を提案しました。また、launchd plistを機能させる前に、スクリプトを実際にCLIから実行できる必要があります。
afragen

1

実行可能ですか?

chmod 700 ~/script.sh

ターミナルで。また、$ HOMEや〜ではなく、ファイルへの実際のパスを使用します。

<?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の理由は何ですか?
TJルオーマ

1

スクリプトがユーザーエージェントである(したがって、Homeフォルダーのライブラリにある)場合、launchd現在の作業ディレクトリはHomeフォルダーです。UNIXは、パスにピリオドを含むホームディレクトリを指します。

基本的に、の./script.sh代わりに使用します~/script.sh。;-)


3
いいえ、launchdの作業ディレクトリは実際/には '〜'ではありません。
ティロ

@Tyiloどういう意味かわかりません。「launchdの作業ディレクトリがルートである場合、すべての場合-ユーザーモードであっても」を意味する場合は、リファレンスを提供してください。「launchdがチルダの代わりにスラッシュを使用する」という意味であれば、私の投稿をもう一度読んでください。ところで、launchdにはいくつかのスクリプトがスケジュールされており、説明した動作に従います。;-)
コンスタンチノツァルーハス

1
@RandyMarch私が発射薬を作った~/Library/LaunchAgentsの引数を持ちます:sh-cecho $HOME > /Users/Tyilo/launchd_home.txt。ではなく、/Users/Tyilo/launchd_home.txt含まれているファイルを実行しました。//Users/Tyilo
ティロ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.