Это сложно. Вот что я придумал: Может быть возможно упростить/упростить его:
#!/bin/sh
pid1file=$(mktemp)
pid2file=$(mktemp)
stat1file=$(mktemp)
stat2file=$(mktemp)
while true; do sleep 42; done &
main_sleeper=$!
(cd frontend && gulp serve & echo "$!" > "$pid1file";
wait "$!" 2> /dev/null; echo "$?" > "$stat1file"; kill "$main_sleeper" 2> /dev/null) &
(cd backend && gulp serve --verbose & echo "$!" > "$pid2file";
wait "$!" 2> /dev/null; echo "$?" > "$stat2file"; kill "$main_sleeper" 2> /dev/null) &
sleep 1
wait "$main_sleeper" 2> /dev/null
if stat1=$(<"$stat1file") && [ "$stat1" != "" ] && [ "$stat1" != 0 ]
then
echo "First process failed ..."
if pid2=$(<"$pid2file") && [ "$pid2" != "" ]
then
echo "... killing second process."
kill "$pid2" 2> /dev/null
fi
fi
if [ "$stat1" = "" ] && \
stat2=$(<"$stat2file") && [ "$stat2" != "" ] && [ "$stat2" != 0 ]
then
echo "Second process failed ..."
if pid1=$(<"$pid1file") && [ "$pid1" != "" ]
then
echo "... killing first process."
kill "$pid1" 2> /dev/null
fi
fi
wait
if stat1=$(<"$stat1file")
then
echo "Process 1 terminated with status $stat1."
else
echo "Problem getting status of process 1."
fi
if stat2=$(<"$stat2file")
then
echo "Process 2 terminated with status $stat2."
else
echo "Problem getting status of process 2."
fi
, пока верно; спят 42; выполнено &
)
что спит/останавливается навсегда. Если вы уверены, что ваши две команды
завершится в течение определенного периода времени (например, часа),
вы можете изменить это на один сон, который превысит
(например, спящий 3600
).
Затем можно изменить следующую логику, чтобы использовать ее в качестве тайм-аута;
то есть, убить процессы, если они все еще работают через столько времени.
(Обратите внимание, что приведенный выше сценарий в настоящее время этого не делает.) cd
не требуется ./
. команда & эхо «$!» > где-то ; подождите «$!»
является сложной конструкцией, которая запускает процесс асинхронно,
захватывает его PID, а затем ожидает его;
создание своего рода основного (синхронного) процесса.
Но это происходит в пределах списка (...)
который полностью находится на заднем плане,
поэтому процессы gulp
выполняются асинхронно. gulp
,
записать его статус во временный файл и завершить процесс «вечно спящего». сон 1
для защиты от состояния гонки
где первый фоновый процесс умирает
прежде чем второй получит возможность записать свой PID в файл. gulp
, как указано выше. -121--30243-
Можно также использовать perl в качестве команды oneliner. Например, для этой проблемы можно использовать:
$ perl -p -e 'if (/^T/) { s/\|0*/\|/g } ' SampleFileName
H|09/24/2015
D|25.00|Name1|Tfile|5
D|7.25|Name2|Tfile|1
T|32.25|3
$
В , если
regex проверяет, начинается ли строка с буквы T
(как я предполагаю, эти строки являются целевыми), и в {}
блок regex заменяет все нули после |
канала.
-121--157485-
ttyPCIx
устройства не являются простыми портами USB, а скорее устройствами USB UART , которые эмулируют последовательный порт через USB. Они часто основаны на чипе Pluffic (PL2303) или FTDI. Вы должны будете получить такое устройство и подключить его к компьютеру для того, чтобы появилась запись /dev/tтyPCIx
в том же пути, как при подключении USB-устройства флэш-памяти создается устройство /dev/sdx
.
Вы можете использовать RT
gawk 'BEGIN{RS="(DEBUG|INFO)"; FS="\n"}{printf "%s%s", $0, RT}' log.txt