Это сложно. Вот что я придумал; его можно упростить / оптимизировать:
#!/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
пока true; do sleep 42; done &
)
, который засыпает / приостанавливается навсегда. Если вы уверены, что ваши две команды
завершатся в течение определенного периода времени (например, часа),
вы можете изменить это на один сон, который превысит этот {{1} } (например, спящий режим 3600
).
Затем вы можете изменить следующую логику, чтобы использовать это как тайм-аут;
т. Е. Убить процессы, если они все еще работают по прошествии этого времени.
(Обратите внимание, что приведенный выше сценарий в настоящее время этого не делает.) ./
для cd
. команда & echo "$!" > где-то ; wait "$!"
- сложная конструкция, которая запускает процесс асинхронно,
захватывает его PID, а затем ждет его;
делая его своего рода передним планом (синхронный) процесс.
Но это происходит в списке (…)
, который полностью находится в фоновом режиме,
поэтому процессы gulp
выполняют работать асинхронно. gulp
записывает свой статус во временный файл и завершает процесс «вечного сна». sleep 1
для защиты от состояния гонки
, когда первый фоновый процесс умирает
до того, как второй получит возможность записать свой PID в файл. gulp
процессов, как указано выше. Otra forma usando ls
y grep -v
. La opción -v
invierte la coincidencia para que solo se enumeren las líneas que no coinciden.
mv `ls | grep -v folder2` folder2
Tenga en cuenta que se utilizan acentos graves y no comillas simples en el comando.
find
+mv
solución:
find folderN/ -mindepth 1 ! -wholename '*/folder2' -exec mv "{}" "folderN/folder2" \;
Mueva la segunda carpeta un paso hacia arriba, mueva el contenido y luego mueva la segunda carpeta hacia atrás. así:
cd folder1
mv folder2..
mv *../folder2/
mv../folder2.
¿Está informando que no puede mover el contenido de una carpeta a otra? ¿Es esta la secuencia de eventos que ha intentado?
$ ls folderN
file1 file2 folder1 folder2
$mv folderN/* folder2
mv: cannot move 'folder2 to a subdirectory of itself, `folder2/folder2`
$ls folderN/folder2
file1 file2 folder1
mv folderN/* folderN/folder2
debería ser el único comando que necesita.