My Launch Daemon non funziona nonostante abbia restituito uno stato 0

1

Per qualche motivo, il demone di avvio che ho creato non verrà eseguito correttamente all'avvio del sistema. L'ho provato come un launch agent ma anche questo non funziona.

Questo è il mio plist situato in / Library / LaunchDaemons:

<?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.inetmac4.status</string>
    <key>ProgramArguments</key>
    <array>
        <string>/bin/sh</string>
        <string>/Users/inetmac4/script/VMSTATUS/vmstatus_startup</string>
    </array>
    <key>KeepAlive</key>
    <false/>
</dict>
</plist>

È interessante notare che lo script viene eseguito correttamente se eseguito manualmente, ma non attraverso il demone. E quando si esegue la lista launchctl dopo l'avvio, lo stato di com.inetmac4.status è 0, ma lo script non sembra mai essere eseguito.

Qualsiasi aiuto sarebbe molto apprezzato! Ho cercato su Google ma nessuna delle soluzioni che ho trovato funzionerà per me.

EDIT: Va notato che sto cercando di eseguirlo su un Mac Pro su 10.8.5

EDIT2: E lo script:

'#!/bin/bash
#cd /Users/inetmac4/
#python -m SimpleHTTPServer > ~/outfile 2> ~/errfile < /dev/null & disown
cd /Users/inetmac4/Script/VMSTATUS/
./VM.sh  > ~/outfile 2> ~/errfile < /dev/null & disown'

VM.sh:

#!/bin/sh

#  VM.sh
#  
#
#  Created by INETMac4 on 9/12/13.
#
COUNTER=0

while [  1 ]; do

    perl VM_STATUS.pl
    let COUNTER=COUNTER+1
    sleep 5
done

e VM_STATUS.pl:

#!/usr/bin/perl
use Data::Dumper;

#-- the same command in list context



    my @result = 'prlctl list --all';

    shift @result;
    open (VMSTATUS, '>/Users/inetmac4/Sites/index.html');
    open (USERLOG, '</Users/inetmac4/script/username_log.txt');

    my @user_log = <USERLOG>;
    my @user_log = reverse(@user_log); 
    my @user_status;

    my %hash = ();
    foreach (@user_log){

        my @values = split(/\/), $_;

        my $computer_name = $values[1];

        if (exists($hash{ $computer_name }) == 0){
            $hash{ $computer_name } = 'true';
            push(@user_status, $_);
        }

    }

    my @user_status_formatted;
    # Replaces domain name with OS type
    foreach (@user_status){
        my @values = split(/\/), $_;

        if ($values[1] =~ /PSSTEAM-W7VPC/){
            push(@user_status_formatted, $values[0] . '\' . "Windows 7" . '\' . $values[2]. '\' . $values[3])
        }
        if ($values[1] =~ /PSSTEAM-W8VPC/){
            push(@user_status_formatted, $values[0] . '\' . "Windows 8" . '\' . $values[2]. '\' . $values[3])
        }
        if ($values[1] =~ /PSSTEAM-XPVPC/){
            push(@user_status_formatted, $values[0] . '\' . "Windows XP" . '\'. $values[2]. '\' . $values[3])
        }

    }
    #print Dumper %hash;

    #print @result;

    foreach (@result){

        my @columns = split(/\s+/), $_;
        my $name  = $columns[3]." ".$columns[4];
        print VMSTATUS "<b>Virtual Machine: </b>". '<a href="VM_Start_INETMAC4_Windows7.cgi">'.$name."</a></br>\n";
        print VMSTATUS "<b>STATUS:</b> ". $columns[1]."</br>\n";
        if ($name =~ 'Windows 8.1'){
            print VMSTATUS "</br>\n";
        }
        foreach (@user_status_formatted){
            my @values = split(/\/), $_;

            if ($values[0] =~ 'LOGGEDOUT' && $values[1] =~ $name){
                print VMSTATUS "<b>User:</b> Loggedout/ No user"."\n</br></br>";
                last;
            }
            if ($values[1] =~ $name){
                print VMSTATUS "<b>User: </b>  " . $values[2] . "\" . $values[3]."\n</br></br>";
            }

        }
        print VMSTATUS "<hr>";
    }

    close (VMSTATUS);
    
posta Tyler 04.10.2013 - 20:49
fonte

2 risposte

2

Per coloro che non vogliono leggere i commenti, è stata una soluzione piuttosto semplice dopo che Mark mi ha dato un po 'di intuizione.

Inizialmente, ho scritto lo script vmstatus_startup per chiamare VM.sh, che aggiornava continuamente lo script perl (ogni 5 secondi). Stavo tentando di chiamare lo script della shell da launchctl che aggiunge solo livelli di complessità.

Invece, chiamare lo script perl direttamente da .plist e dare la chiave keep-alive gli permetteva di essere eseguito costantemente dopo l'avvio.

Infine, dovevo assicurarmi di aggiungere la directory perl al file .plist sopra la posizione dello script, dal momento che launchd non ha un PATH nello stesso modo in cui lo fa un utente.

    
risposta data 07.10.2013 - 17:36
fonte
0

È necessario aggiungere <key>RunAtLoad</key><true/> per eseguire il programma quando il lavoro è caricato (o al login). Guarda man launchd.plist :

RunAtLoad <boolean>
This optional key is used to control whether your job is launched once at
the time the job is loaded. The default is false.

Se vuoi che il programma venga eseguito di nuovo se termina, imposta anche KeepAlive su true.

Puoi applicare le modifiche a un plist scaricandolo e caricandolo.

    
risposta data 05.10.2013 - 14:21
fonte

Leggi altre domande sui tag