Как создать новый фоновый процесс в цикле KSH «в то время как чтение»?

3782
yael

Следующий тестовый скрипт имеет проблему. Когда я добавляю строку (sleep 5 ) &в скрипт, тогда цикл «пока читается» не читает все строки из файла, а только печатает первую строку.

Но когда я удаляю ( sleep 5 ) &из сценария, сценарий печатает все строки, как определено в файле.

Почему ( sleep 5 ) &причины этого?

И как решить проблему? Я хочу создать новый процесс (для которого sleepэто просто пример) в цикле while:

$ more test  #!/bin/ksh  while read -r line ; do echo Read a line: echo $line  ( sleep 5 )& RESULT=$! echo Started background sleep with process id $RESULT  sleep 1 echo Slept for a second  kill $RESULT  echo Killed background sleep with process id $RESULT done < file echo Completed  

В моем Linux при использовании следующего содержимого file:

$ more file  123 aaa  234 bbb  556 ccc 

... бег ./testтолько дает мне:

Прочитайте строку: 123 ааа Начался фоновый сон с идентификатором процесса 4181 Спал на секунду  Убит фоновый сон с идентификатором процесса 4181 Завершенный
0
Этот вопрос, вероятно, лучше подходит для переполнения стека. Ваш вопрос будет перенесен туда автоматически. Hello71 13 лет назад 0
Вас несколько раз просили правильно отформатировать ваши сообщения. Используйте кнопку `101010` или сделайте отступ в каждой строке кода на четыре пробела, пожалуйста. Также вам нужно пометить некоторые ответы как принятые. Dennis Williamson 13 лет назад 2
Это прекрасно работает для меня. Dennis Williamson 13 лет назад 2
Я просто откатил ваше редактирование снова, Яэль, не отменяйте правки, сделанные другими, если это улучшает форматирование. Это считается грубым, упрямым и детским. Если вам не нравятся люди, редактирующие ваши сообщения, этот сайт может быть не для вас. BloodPhilia 13 лет назад 3
Деннис, ты проверил это yael 13 лет назад 0
Деннис, ты проверил сценарий? yael 13 лет назад 0
Деннис, вероятно, использовал сценарий, как сейчас в вашем посте, я предлагаю вам попробовать. BloodPhilia 13 лет назад 0
Привет снова, этот скрипт, который я редактирую в первый раз, такой же, как и сейчас, и проблема все еще существует. yael 13 лет назад 0
Что касается "когда я удаляю` (sleep 5) & `из скрипта", я предполагаю, что вы также удаляете "kill" тогда? Arjan 13 лет назад 0
Нет (сон 5) & должно быть в скрипте, проблема в том, почему цикл не продолжится, если я поставлю (сон 5) & ?? Яэль yael 13 лет назад 0
Сценарий выше работает хорошо для меня (на Mac) и для Денниса. Предполагая, что это всего лишь пример версии чего-то более полезного, вы действительно запускали точно такой же скрипт? Arjan 13 лет назад 0
А что касается «почему цикл не продолжен» - конечно, цикл * спит * на секунду, из-за «сна 1». Но после этого все продолжается нормально, на моем компьютере. Arjan 13 лет назад 0
да, когда я запускаю этот скрипт, скрипт выводит только первую строку: 123 ааа цель - напечатать все строки в файле yael yael 13 лет назад 0
ты машина работала на LINUX? yael 13 лет назад 0
* Твой *? Вы не даете нам эту информацию ... :-( (Как я уже писал: я тестировал на Mac, который также имеет встроенный KSH.) Arjan 13 лет назад 1
моя машина LINUX yael yael 13 лет назад 0
Я запустил машину с Ubuntu 9.10, но на ней не установлен KSH. Использование оболочки Bash по умолчанию также не доставляет мне проблем на этой машине с Ubuntu. Странный. Arjan 13 лет назад 1
в соответствии с вашим последним тестом я и у вас те же результаты yael 13 лет назад 0
Я тестировал его на Ubuntu 9.10 с ksh 93, и он работает нормально. Я даже изменил файл данных так, чтобы в конце строки DOS использовался `unix2dos`, чтобы увидеть, может ли что-то подобное быть вашей проблемой. Он все еще работал нормально (обе версии вашего скрипта). Кстати, подоболочка вокруг `sleep 5` не нужна, но я сомневаюсь, что это является причиной вашей проблемы. Вы можете просто сделать `сон 5 &` Dennis Williamson 13 лет назад 1
@yeal, * в соответствии с вашим последним тестом я и вы получили одинаковые результаты * - нет, я получаю * все * строки (как Деннис). Я скопировал * твои * результаты в твой вопрос, а не мой, конечно. Пожалуйста, измените вопрос, включив в него версию скрипта, которая также печатает все строки для вас. (Итак: версия без "(sleep 5) &" и всего, что вы потом удалили.) Arjan 13 лет назад 1
(И посмотрите [Как работают ответы на комментарии?] (Http://meta.stackexchange.com/questions/43019/how-do-comment-replies-work)) Arjan 13 лет назад 1
(сон 5), и потому что он проверяет только скрипт оригинала, он выглядит следующим образом: (сон 20; седь ........; ...) & yael 13 лет назад 0
так что в конце концов у нас нет решения - (: yael 13 лет назад 0
1) Что дает `ksh -m. / Test`? 2) Я сомневаюсь, что это помогает, но попробуйте `#! / Bin / bash` вместо` #! / Bin / ksh` 3) Запустите `ksh -v. / Test`, чтобы увидеть, дает ли это больше подробностей? 4) Какую версию KSH вы используете? Смотрите `ksh 'print $ {. Sh.version}'` 5) Какой Linux вы используете? Смотрите `uname -v` 6) Поскольку весь этот пост довольно запутанный, еще раз: пожалуйста, покажите нам версию сценария, которая * работает * для вас? (Итак, как я и просил два раза ранее: версия без `(сон 5) &`.) Arjan 13 лет назад 1

1 ответ на вопрос

1
Gilles

Из журнала изменений Ksh для ksh93s:

06-10-23 Исправлена ​​ошибка, из-за которой на значение $!влияло фоновое задание, запускаемое из подоболочки.

Если ваша версия ksh старше этой (вы должны указать версию в своем вопросе!), Вы можете наблюдать эту ошибку.

Похожие вопросы