Я хочу запустить три процесса, которые все перестанут показывать, что служба запущена, и приглашение не будет выдано. Я хочу автоматизировать эту процедуру. Я попытался использовать «&» в конце, но он появляется в терминале. Я попытался использовать «sh + x script1.sh & sh + x script2.sh» I need to stop the process by pressing ctrl+c for another script to run Пожалуйста, помогите в этомКак запустить несколько сценариев оболочки, которые не дают подсказки в конце
ответ
Необходимо определить общий скрипт, который запускает три процесса в фоновом режиме и ждет, чтобы пользователь нажал кнопку «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
@ Шрейас, пожалуйста, рассмотрите [принятие этого ответа] (https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work), если это было полезно. –
Ваш вопрос чрезвычайно кратким. Вы не можете прервать программу с помощью Ctrl C, если она не работает на переднем плане. – sjsam
проверить это [вопрос] (http://stackoverflow.com/questions/356100/how-to-wait-in-bash-for-several-subprocesses-to-finish-and-return-exit-code-0), может помочь вам –
@sjsam: вы не можете сделать это напрямую, но можно настроить обработчик сигнала в переднем плане, который улавливает элемент управления-c, а затем посылает соответствующий сигнал фоновому процессу. – user1934428