Mi Launch Daemon no funciona a pesar de devolver un estado 0

1

Por alguna razón, el daemon de inicio que creé no se ejecutará correctamente al iniciar el sistema. Lo he intentado como agente de lanzamiento, pero eso tampoco funciona.

Esta es mi lista ubicada en / 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>

Curiosamente, el script se ejecuta correctamente si se ejecuta manualmente, pero no a través del demonio. Y cuando se ejecuta la lista launchctl después del inicio, el estado de com.inetmac4.status es 0, pero el script nunca se ejecutó.

Cualquier ayuda sería muy apreciada! He buscado en Google, pero ninguna de las soluciones que he encontrado funcionará para mí.

EDITAR: se debe tener en cuenta que estoy intentando ejecutarlo en un Mac Pro en 10.8.5

EDIT2: Y el 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

y 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);
    
pregunta Tyler 04.10.2013 - 20:49

2 respuestas

2

Para aquellos que no quieren leer los comentarios, fue una solución bastante simple después de que Mark me dio un poco de información.

Inicialmente, escribí el script vmstatus_startup para llamar a VM.sh, que luego actualizaría continuamente el script perl (cada 5 segundos). Estaba intentando llamar al script de shell desde launchctl, que solo agrega capas de complejidad.

En su lugar, llamar al script de perl directamente desde la lista .list y darle la clave de mantener vivo le permitió ejecutarse constantemente después del arranque.

Finalmente, tuve que asegurarme de agregar el directorio perl a .plist sobre la ubicación del script ya que launchd no tiene un PATH de la misma manera que un usuario.

    
respondido por el Tyler 07.10.2013 - 17:36
0

Es necesario agregar <key>RunAtLoad</key><true/> para ejecutar el programa cuando se carga el trabajo (o al iniciar sesión). Ver 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.

Si desea que el programa se ejecute nuevamente si finaliza, también establezca KeepAlive en verdadero.

Puede aplicar cambios a un plist descargándolo y cargándolo.

    
respondido por el user495470 05.10.2013 - 14:21

Lea otras preguntas en las etiquetas