0

Mac の起動時に実行されるデーモンを開発しました。このデーモンは、新しい OSX 10.8.5 をインストールするまで正しく実行されます [このデーモンは 10.8.4 で正しく実行されます]。

どこが間違っているのかわかりませんが、

次のような辞書を作成するターミナル アプリを作成しました。

KeepAlive = 1;
Label = "vetrya.ControlloPresenza";
MachServices =     {
    "vetrya.ControlloPresenza" = 1;
};
Program = "/System/Library/VetryaControllo/ControlloPresenza";
ProgramArguments = start;
RunAtLoad = 1;
StartInterval = 20;
inetdCompatibility =     {
    Wait = 0;
};

次に、この Dir 内にこの dict を書き込みます: /System/Library/LaunchDaemons/

しかし今、このプロセスは開始されていません。誰もこの理由を知っていますか?

これは私が辞書を書く方法とplist戦争の結果を正しく書く

NSMutableArray* arrayArguments = [[NSMutableArray alloc] initWithCapacity:1];
[arrayArguments addObject:@"/System/Library/VetryaControllo/ControlloPresenza"];
[arrayArguments addObject:@"start"];
NSDictionary* dict = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:NO],@"Wait", nil];
NSDictionary* dictNew = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES],@"vetrya.ControlloPresenza", nil];

[self.controlloPresenza setObject:@"vetrya.ControlloPresenza" forKey:@"Label"];
[self.controlloPresenza setObject:@"/System/Library/VetryaControllo/ControlloPresenza" forKey:@"Program"];
[self.controlloPresenza setObject:@"start" forKey:@"ProgramArguments"]; 
[self.controlloPresenza setObject:dict forKey:@"inetdCompatibility"];
[self.controlloPresenza setObject:dictNew forKey:@"MachServices"];
[self.controlloPresenza setObject:[NSNumber numberWithBool:YES] forKey:@"KeepAlive"];
[self.controlloPresenza setObject:[NSNumber numberWithBool:YES] forKey:@"RunAtLoad"];
[self.controlloPresenza setObject:[NSNumber numberWithInt:20] forKey:@"StartInterval"];

私はいくつかの変更を加えましたが、plistは次のとおりです。

<?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>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>vetrya.ControlloPresenza</string>
    <key>MachServices</key>
    <dict>
        <key>vetrya.ControlloPresenza</key>
        <true/>
    </dict>
    <key>Program</key>
    <string>/System/Library/VetryaControllo/ControlloPresenza</string>
    <key>ProgramArguments</key>
    <string>start</string>
    <key>RunAtLoad</key>
    <true/>
    <key>StartInterval</key>
    <integer>20</integer>
    <key>inetdCompatibility</key>
    <dict>
        <key>Wait</key>
        <false/>
    </dict>
</dict>
</plist>

デーモンを次の再起動に登録するには、次のターミナルコマンドを使用できることをオンラインで見つけました。

sudo chown root:wheel <name.plist>
sudo chmod 644 <name.plist>

しかし、次のように NSTask を作成すると:

 NSTask *task;
    task = [[NSTask alloc] init];
    [task setLaunchPath:_registrationPath];
    [task setArguments: @[@"sudo", @"chown",@"root:wheel",@"vetrya.ControlloPresenza.plist"]];

    NSPipe *pipe;
    pipe = [NSPipe pipe];
    [task setStandardOutput: pipe];

    NSFileHandle *file;
    file = [pipe fileHandleForReading];
    [task launch];
    [task waitUntilExit];

    task = [[NSTask alloc] init];
    [task setLaunchPath:_registrationPath];
    [task setArguments: @[@"sudo", @"chmod",@"644",@"vetrya.ControlloPresenza.plist"]];

    pipe = [NSPipe pipe];
    [task setStandardOutput: pipe];

    file = [pipe fileHandleForReading];
    [task launch];
    [task waitUntilExit];

しかし、最後にこのエラーがあります: 失敗しました: 22、「無効な引数」。このコマンドをどのように書く必要がありますか?

よろしく

4

1 に答える 1

0

値を書き出していると言っているため、質問で示したサンプルからこれを省略しただけかもしれませんが、Daemons and Servicesに関する Apple のドキュメントを読むと、plist が表示されることがわかります。次のように、キーと値を指定する必要があります。

<key>KeepAlive</key>
<integer>1</integer>
<key>Label</key>
<string>"vetrya.ControlloPresenza"</string>

さらに、それがあなたがしていることである場合、プログラムの引数を文字列の配列ではなく値に設定していることがわかります。

<key>ProgramArguments</key>
<array>
    <string>start</string>
</array>
于 2013-09-20T12:21:19.620 に答える