Oto, co muszę zrobić:
- rozpocznij proces A w tle
- poczekaj x sekund
- rozpocznij proces B na pierwszym planie
Jak mogę sprawić, że zacznie się czekać?
Widzę, że „sen” wydaje się zatrzymywać wszystko i nie chcę tak naprawdę „czekać”, aż proces A zakończy się całkowicie. Widziałem pewne pętle oparte na czasie, ale zastanawiam się, czy jest coś czystszego.
sleep
zatrzymuje proces A? Czy możesz pokazać proces testowy, którego używasz, lub wynik, który to wskazuje? Jeśli proces-A jest zatrzymanie, to bardziej prawdopodobne, że próbuje odczytać z terminala podczas pracy w tle i coraz zatrzymany z tego powodu, raczej niż cokolwiek związanegosleep
.process_a </dev/null &
dołączy do jego stdin/dev/null
zamiast TTY, a które mogą być wystarczające, aby uniknąć tego problemu.Odpowiedzi:
O ile nie rozumiem twojego pytania, można to po prostu osiągnąć za pomocą tego krótkiego skryptu:
(i dodaj dodatkową
wait
na końcu, jeśli chcesz, aby skrypt czekał naprocess_a
zakończenie przed zakończeniem).Możesz to zrobić nawet jako jeden wiersz, bez potrzeby używania skryptu (jak sugeruje @BaardKopperud):
źródło
bash
tego, jakakolwiek powłoka zrobi to włączając twój systemsh
, więc nie musisz dodawać zależności od bash dla twojego skryptu.Możesz użyć operatora sterowania w tle (&), aby uruchomić proces w tle, i
sleep
polecenia, aby poczekać przed uruchomieniem drugiego procesu, tj .:Oto przykład dwóch poleceń, które drukują niektóre wiadomości ze znacznikiem czasu:
Uruchom go, aby sprawdzić, czy wykazuje pożądane zachowanie:
źródło
Podoba mi się odpowiedź @ dr01, ale on nie sprawdza kodu wyjścia, więc nie wiesz, czy ci się udało, czy nie.
Oto rozwiązanie, które sprawdza kody wyjścia.
zwykle przechowuję PID w tablicy bash, a następnie sprawdzanie pid jest pętlą for.
źródło
A & sleep x; B; ret=$?; wait "$!" || exit "$ret"
process_b
działać na pierwszym planie. Prawdopodobnieprocess_a
można wyjść, gdyprocess_b
jest uruchomiony, ale nadal możeszwait
to zrobić i uzyskać status wyjścia po zebraniu statusu wyjścia na pierwszym planieprocess_b
w normalny sposób,$?
bezpośrednio.