2012-12-27 15 views
6

Napisałem skrypt basha do uruchomienia usługi w tle i wyjścia ze skryptu do linii poleceń. Ale po uruchomieniu polecenia eval kontrola nie przejdzie następnej instrukcji.kontrola do następnej instrukcji po uruchomieniu polecenia eval

COMMAND="nohup java -jar jenkins.war" 
echo "starting service" 
eval $COMMAND 
echo "service running" 
exit 

echo "usługa działa" i wyjście nigdy się nie dzieje. Chcę uruchomić proces w tle i powrócić do wiersza polecenia, gdy usługa jest nadal uruchomiona. Jak mam to zrobic?

+0

Dziękujemy wszystkim, którzy odpowiedział na pytanie i pomógł mi! :-) – user1164061

Odpowiedz

11

Proszę nie umieszczać polecenia z jego argumentów w ciąg. Połóż polecenia i jego argumenty w sposób array (i nie używaj nazw zmiennych pisanych dużymi literami, to strasznie zła praktyka), a nie używaj eval. eval jest zły!

command=(nohup java -jar jenkins.war) 
echo "starting service" 
"${command[@]}" 2> /dev/null & 
echo "service running" 

Polecenie działające w tle wymaga &.

+0

Dzięki temu zadziałało. Mam pod-pytanie. Teraz powraca do wiersza poleceń po wywołaniu polecenia "service running", ale wyświetla "nohup: dodając wyjście do" nohup.out "i nie powraca do wiersza poleceń, dopóki nie uderzę ctrl + c. Jak mogę go uruchomić bezpośrednio w wierszu poleceń? bez wciskania ctrl + c? Nie mam nic przeciwko zapisywaniu wyniku do dowolnej nazwy pliku, ale proces nie powinien się zatrzymywać, dopóki go nie zabiję – user1164061

+0

@ user1164061 Nie musisz naciskać Ctrl + C, po prostu naciśnij enter. edytowałem mój post, aby nie było denerwującej wiadomości: –

+0

+1 dla komentarza 'eval', +10 dla' "$ {command [@]}" '. – l0b0

1

eval nie rozwiązuje tego problemu, potrzebny jest znak "run-in-background", tj. "&" (bez cudzysłowów).

Przepisz linię jako

#eval $COMMAND 
$COMMAND & 

W zależności od tego, co jeszcze trzeba się naprawdę w $ polecenie, może trzeba postawić eval powrotem.

Ponadto, w zależności od potrzeb, prowadzenie procesu w tle wygeneruje jakiś jobs wyjście, to znaczy

[1]  10079 

Do STD-błędów konsoli. Potrzebujesz dodatkowej składni, aby przekierować ją do/dev/null. Oto przykład:

COMMAND="sleep 10" 
{ $COMMAND & ; } 1>/dev/null 2>&1 

Korzystanie z grupy procesów (the { .... ; } nie powinny powodować żadnych problemów, ale może

IHTH

2

Dodaj ampersanda do końca rozmowy.

eval $COMMAND & 
3

Spróbuj:

command="java -jar jenkins.war" 
echo "starting service" 
$command </dev/null >jenkins.out 2>jenkins.err & 
echo "service running" 
Powiązane problemy