2016-12-12 4 views
1

Я хочу запустить три процесса, которые все перестанут показывать, что служба запущена, и приглашение не будет выдано. Я хочу автоматизировать эту процедуру. Я попытался использовать «&» в конце, но он появляется в терминале. Я попытался использовать «sh + x script1.sh & sh + x script2.sh» I need to stop the process by pressing ctrl+c for another script to run Пожалуйста, помогите в этомКак запустить несколько сценариев оболочки, которые не дают подсказки в конце

+0

Ваш вопрос чрезвычайно кратким. Вы не можете прервать программу с помощью Ctrl C, если она не работает на переднем плане. – sjsam

+0

проверить это [вопрос] (http://stackoverflow.com/questions/356100/how-to-wait-in-bash-for-several-subprocesses-to-finish-and-return-exit-code-0), может помочь вам –

+0

@sjsam: вы не можете сделать это напрямую, но можно настроить обработчик сигнала в переднем плане, который улавливает элемент управления-c, а затем посылает соответствующий сигнал фоновому процессу. – user1934428

ответ

0

Необходимо определить общий скрипт, который запускает три процесса в фоновом режиме и ждет, чтобы пользователь нажал кнопку «Control + C. Затем вы добавляете ловушку в общий скрипт, чтобы запустить hookdown.

Я думаю, что решение может выглядеть следующим образом:

#!/bin/bash 

end_processes() { 
    echo "Shutdown hook" 
    if [ -n $PID1 ]; then 
    echo "Killing PID 1 = $PID1" 
    kill -9 $PID1 
    fi 
    if [ -n $PID2 ]; then 
    echo "Killing PID 2 = $PID2" 
    kill -9 $PID2 
    fi 
    if [ -n $PID2 ]; then                                         
    echo "Killing PID 3 = $PID3" 
    kill -9 $PID3 
    fi 
} 

# Main code: Add trap 
trap end_processes EXIT 

# Main code: Launch scripts 
./script1.sh & 
PID1=$! 

./script2.sh & 
PID2=$! 

./script3.sh & 
PID3=$! 

# Main code: wait for user to press Control+C 
while [ 1 ]; do 
    sleep 1s 
done 

Обратите внимание, что:

  • я добавил некоторые эхо-сообщения только для проверки.
  • Ловушка выполняет функцию, когда EXIT получен в скрипте. Вы можете изменить принятый сигнал, захватив только определенный сигнал (т. Е. SIGINT)
  • Функция trap теперь убивает процессы с -9. Я хочу, вы можете отправить другие сигналы об убийстве
  • $! извлекает PID из последней команды backgroud.
  • Вы можете изменить цикл ожидания (последний в то время как команда), чтобы спать во-первых, для приблизительная время процессов до конца, а затем ждать еще меньшее время:

    APROX_TIME=30s 
    POLL_TIME=2s 
    sleep $APROX_TIME 
    while [ 1 ]; do 
        sleep $POLL_TIME 
    done 
    
+0

@ Шрейас, пожалуйста, рассмотрите [принятие этого ответа] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), если это было полезно. –