Nie mogę zrozumieć, jak to zrobić, czego potrzebuję, jest po "C" sekund, DD zatrzymuje się. Ale pracuje i ignoruje zarówno podczas pętli, jak i sekund

read c
end=$((SECONDS+$c))

while [ $SECONDS -lt $end ]; do
    echo "Moving..."
    dd if=/dev/zero of=/dev/null 

done
0
anon999 8 marzec 2020, 01:11

2 odpowiedzi

Najlepsza odpowiedź

Dodawanie mojego komentarza jako odpowiedź na kompletność:

Aby zatrzymać proces po danym czasie, możesz uruchomić go za pomocą timeout Jeśli twój system go zapewnia; Jest częścią GNU Coreutils (ale najwyraźniej nie określono przez POSIX).

W twoim przypadku, zamiast swojej pętli, możesz uruchomić

timeout "$c" dd if=/dev/zero of/dev/null
2
Benjamin W. 8 marzec 2020, 00:52

To nie jak działa pętle. Twoja konstrukcja uruchomi się do dd zakończy się. Jeśli chcesz go zakończyć po kilku sekundach, powinieneś się go wywołać za pomocą timeout (prawie na pewno preferowany roztwór) lub wysłać go wyraźnie sygnał. np. coś takiego:

dd if=/dev/zero of=/dev/null &
sleep $c
kill $!

Przy użyciu & jako terminator polecenia przyczyny dd, aby uruchamiać asynchronicznie (aka "w tle"), więc sterowanie zwraca natychmiast do powłoki, przechowywanie PID polecenia dd w zmienna $!. Shell następnie śpi przez nieco i wysyła sygnał, aby zakończyć dd.

2
William Pursell 8 marzec 2020, 01:02