2016-06-22 24 views
1

Ich arbeite derzeit an einem Programm, das ein Programm automatisch starten muss, wenn es registriert, dass dieses Programm nicht bereits geöffnet ist. Es benötigt Superuser-Rechte zum Booten. Derzeit habe ich eine Arbeits Bash-Skript, auf der Suche wie folgt:Bash-Skript mehrere Befehle Problem

#!/bin/bash 

while true; do #Continue indefinitely 

    if [ $(ps aux | grep '/odroid_detection' | grep -v '<defunct>' -c) -le 4 ]; then #if less than 3 odroid_servers are active (booter opens 3 processes) 
     xterm -iconic -e su -c "xterm -iconic -hold /home/odroid/Documents/SUNRISE-Odroid/_odroid_detection/_odroid_detection/bin/Debug/_odroid_detection" 
    fi 

    sleep 60 #check every minute 

done 

Das Programm, das jedoch ausgeführt wird, funktioniert nicht genau wie geplant, weil es von der Wurzel Karte anstelle der Karte, um diese in ist ausgeführt wird. Ich möchte daher auf die Karte, in der sich die ausführbare Datei befindet (~/Documents/SUNRISE-Odroid/_odroid_detection/_odroid_detection/bin/Debug), aber die gleiche Funktionalität wie oben erwähnt haben. Das ist, was ich kam mit:

#!/bin/bash 

while true; do #Continue indefinitely 

    if [ $(ps aux | grep '/odroid_detection' | grep -v '<defunct>' -c) -le 4 ]; then #if less than 3 odroid_servers are active (booter opens 3 processes) 
     xterm -iconic -e "cd ../_odroid_detection/_odroid_detection/bin/Debug/ && su -c "xterm -iconic -hold -e _odroid_detection"" 
    fi 

    sleep 60 #check every minute 

done 

Dies funktioniert jedoch nicht, und ich habe viele Alternativen ausprobiert, aber ich kann nicht scheinen, daran zu arbeiten .. Es die folgenden Fehler im Terminal gibt:

xterm: Can't execvp cd ../_odroid_detection/_odroid_detection/bin/Debug && su -c xterm: No such file or directory 

Das Xterm, das diesen Fehler gibt, öffnet sich in der Karte ~/Documents/SUNRISE-Odroid/Bash, und das Ausführen der oben genannten CD funktioniert, wenn ich es separat ausführe, also verstehe ich nicht, warum es die Datei nicht finden kann Verzeichnis.

Irgendwelche Vorschläge?

+2

Nicht verwandt mit der Bash-Frage. Haben Sie darüber nachgedacht, [Supervisor] (http://supervisord.org/) zu verwenden? Dies ist die genaue Art der Sache, die der Supervisor tut; Behalte X Anzahl der Prozesse am Leben (über die Konfigurationseinstellung 'numprocs'). – Dencker

+0

Wie in 'man xterm choroba

+0

Okay, die Einfärbung von StackOverflow ließ mich einen Fehler, den ich gemacht habe, verstehen: Das Anfangszitat nach 'su -c' wird als Endzitat der xterm execute-Zeile interpretiert. Ich habe jetzt ein Arbeitsprogramm, wird die Lösung in ein bisschen posten. – Timmeh

Antwort

0

Die Einfärbung von StackOverflow hat mir einen Fehler verständlich gemacht, den ich gemacht habe: das Anfangszitat nach 'su -c' wird als Endzitat der xterm execute-Zeile interpretiert. Der Arbeitscode lautet wie folgt:

#!/bin/bash 

while true; do #Continue indefinitely 

    if [ $(ps aux | grep '/odroid_detection' | grep -v '<defunct>' -c) -le 2 ]; then #if less than 3 odroid_servers are active (booter opens 3 processes) 
     xterm -iconic -e "cd ../_odroid_detection/_odroid_detection/bin/Debug/ && su -c ./_odroid_detection" 
    fi 

    sleep 60 #check every minute 

done