2016-06-22 2 views
1

В настоящее время я работаю над программой, которая должна автоматически загружать программу, когда она регистрирует, что эта программа еще не открыта. Для загрузки требуется права суперпользователя. В настоящее время у меня есть рабочий Баш скрипт, глядя следующим образом:Проблема с несколькими командами Bash

#!/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 

Программа, которая выполняет, однако, не работает так, как планировалось, так как он выполнен из корня карты вместо карты он находится. Поэтому я хочу указать cd на карту, в которой находится исполняемый файл (~/Documents/SUNRISE-Odroid/_odroid_detection/_odroid_detection/bin/Debug), но имеют те же функции, что указаны выше. Это то, что я придумал:

#!/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 

Это не работает, однако, и я перепробовал много вариантов, но я не могу заставить его работать .. Это дает следующие ошибки в терминале:

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

xterm, который дает эту ошибку, открывается на карте ~/Documents/SUNRISE-Odroid/Bash, а выполнение упомянутого выше cd-файла работает, когда я выполняю его отдельно, поэтому я не понимаю, почему он не может найти файл или каталог.

Любые предложения?

+2

Не связано с вопросом bash. Рассматривали ли вы использование ['supervisor'] (http://supervisord.org/) для этого? Это точный тип, который выполняет супервайзер; сохранить X количество процессов в живых (через настройку 'numprocs' config). – Dencker

+0

Как указано в 'man xterm',' -e' принимает программу и ее аргументы как параметр, а не список команд. Однако вы можете запускать 'bash' как программу. – choroba

+0

Хорошо, раскраска StackOverflow заставила меня понять одну ошибку, которую я сделал: стартовая цитата после того, как «su -c» интерпретируется как конечная цитата строки выполнения xterm. У меня теперь есть рабочая программа, выложите решение немного. – Timmeh

ответ

0

Раскраска StackOverflow заставила меня понять одну ошибку, которую я сделал: стартовая цитата после того, как «su -c» интерпретируется как конечная цитата строки выполнения xterm. Рабочий код выглядит следующим образом:

#!/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 
Смежные вопросы