2015-08-06 10 views
3

Я хочу получить вывод команды/скрипта переменной, но процесс запускается в фоновом режиме. Я попробовал, как показано ниже, и несколько серверов правильно работали, и я получил ответ. Но в немногих я получаю i_res как пустой.Выход вывода фонового процесса в переменную Shell

Я пытаюсь запустить его в фоновом режиме, так как команда имеет шанс попасть в состояние зависания, и я не хочу повесить родительский скрипт.

Уверен, что скоро получите ответ.

#!/bin/ksh 

x_cmd="ls -l" 

i_res=$(eval $x_cmd 2>&1 &) 

k_pid=$(pgrep -P $$ | head -1) 

sleep 5 
c_errm="$(kill -0 $k_pid 2>&1)"; c_prs=$? 

if [ $c_prs -eq 0 ]; then 

    c_errm=$(kill -9 $k_pid) 

fi 

wait $k_pid 

echo "Result : $i_res" 

ответ

1

Попробуйте что-то вроде этого:

#!/bin/ksh 


pid=$$      # parent process 
(sleep 5 && kill $pid) & # this will sleep and wake up after 5 seconds   
          # and kill off the parent. 
termpid=$!     # remember the timebomb pid 
# put the command that can hang here 
result=$(ls -l) 
          # if we got here in less than 5 five seconds: 
kill $termpid    # kill off the timebomb 
echo "$result"    # disply result 
exit 0 

Добавить любые сообщения, которые вы должны кода. В среднем это завершится намного быстрее, чем всегда, с заявлением сна. Вы можете увидеть, что он делает, сделав команду sleep 6 вместо ls -l

+0

Я не могу убить текущий процесс ($$) после 5 секунд, так как другие действия также должны запускаться на основе вывода команды. То, что мне нужно, результат должен иметь результат $ (ls -l), и если «ls -l» повесится в любом случае, я должен убить эту конкретную команду и продолжить. – nibs