2013-05-30 2 views
0

У меня есть сценарий bash, который печатает строку текста в файл, а затем вызывает второй скрипт, который печатает еще несколько данных в один и тот же файл. Позволяет называть их script1.sh и script2.sh. Причина, по которой он разделен на два сценария, заключается в том, что у меня разные версии script2.sh.Первая строка в файле не всегда печатается в скрипте bash

script1.sh:

rm -f output.txt 
echo "some text here" > output.txt 
source script2.sh 

script2.sh:

./read_time >> output.txt 
./run_program 
./read_time >> output.txt 

Вариации на три линии в script2.sh повторяются.

Это, похоже, работает большую часть времени, но каждый раз файл output.txt не содержит строки «некоторый текст здесь». Сначала я подумал, что это потому, что я вызывал script2.sh следующим образом: ./script2.sh. Но даже при использовании source проблема все еще возникает. Проблема не воспроизводима, поэтому даже когда я пытаюсь что-то изменить, я не знаю, действительно ли она исправлена.

Что может быть причиной этого?

Редактировать: Сценарии очень просты. script1 точно так же, как вы видите здесь, но с разными именами файлов. сценарий 2 - это то, что я опубликовал, но затем повторяются те же 3 строки, и у ./run_program могут быть разные аргументы. Я сделал grep для выходного файла, и для >, но он нигде не обнаруживается.

Способ использования этих сценариев заключается в том, что скрипт1 создается программой (единственная разница между версиями - это строка source script2.sh.Это сценарий1.sh затем запускается на другом компьютере (linux на FPGA на самом деле), используя ssh Прежде чем это будет сделано, выходной файл также будет удален с помощью ssh. Я не знаю, почему, но я не написал все это. Кроме того, я проверил код, запущенный на хосте. выходной файл, когда он удаляется с помощью ssh, и когда он копируется обратно на хост после завершения скрипта.

Редактировать 2: Я, наконец, сумел сделать проблему воспроизводимой с разумной скоростью, сняв script2.sh всего, кроме одной строки, печатающей в файл. Это также позволяет мне делать тестирование немного быстрее. Как только у меня это было, у меня проблема между 1 и 4 раза за каждые 10 прогонов. Удаление команды, удаляющей файл поверх ssh до запуска скрипта, похоже, решило проблему. Я буду проверять его еще немного, но я думаю, что он решен. Хотя я все еще не уверен, почему это будет проблемой. Я думал, что команда ssh не выйдет, прежде чем все команды удаления будут выполнены.

+0

- output.txt на удаленной файловой системе? или файловой системы, монтируемой в NFS? –

+0

Поздравляю с решением этого :)! – spbnick

+0

Спасибо за помощь. Оказывается, ssh был запущен неблокирующим способом. Я изменил его на блокировку, и теперь он работает так, как ожидалось. Я был готов поставить чек, чтобы увидеть, была ли напечатана первая строка, но зная реальную причину и исправление, это намного лучше. – user2435542

ответ

1

Трудно сказать, не видя реального кода. Скорее всего, объяснение состоит в том, что у вас есть опечатка, > вместо >>, где-то в одном из файлов script2.sh.

Для этого необходимо установить noclobber с set -o noclobber. Затем оболочка будет завершена при попытке записать в существующий файл с >.

Другая возможность заключается в том, что файл удаляется при определенных редких условиях. Или он поврежден некоторой командой, которая может иметь произвольный доступ к ней - ищите команды, используя этот файл без >>. Или он используется какой-то командой как в качестве входных, так и выходных, которые наступают друг на друга - ищите файл, используемый с <.

Наконец, вы можете иметь гоночное состояние с командой, выводимой в файл в фоновом режиме, начиная с этого echo.

+0

Я вполне уверен, что это не так. Когда я замечаю проблему и снова запускаю тот же скрипт, она исчезает. Также, чтобы убедиться, что я проверил некоторые из сценариев, где я это заметил, и там нет отсутствующего '>'. Я бы хотел опубликовать код, конечно, но не могу. – user2435542

+0

Тогда есть универсальный совет: начните упрощать свои сценарии, удаляя несвязанный код, пока это не станет очевидным, что происходит, или вы можете опубликовать их в своем вопросе. – spbnick

+0

Также проверьте мои добавления к ответу. – spbnick

1

Вы можете использовать все ваши скрипты для 'output.txt'? Как насчет скриптов, вызываемых внутри read_time и run_program?

Похоже, что что-то в одном скрипте script2.sh должно быть либо переписано, усечено, либо выполнено подстановкой на output.txt.

Например, может существовать '> output.txt', выполняемое внутри условного выражения для условия, которое редко получается. Просто догадаться, но это объясняет, почему вы не всегда это видите.

Это интересная проблема. Пожалуйста, опубликуйте решение, когда найдете его!

+0

Грепинг скриптов дает только такие результаты, как './read_time >> output.txt'. Я также искал источники других программ, запущенных в то время, и никто не упоминает output.txt. – user2435542

+0

связанной идеей было бы изменить такое общее имя выхода на что-то гораздо менее вероятное для использования любой другой программой в любом месте в среде O.P.s, например 'special_testCase. $$. Txt.output', или какой-то такой безумие. Всем удачи. – shellter

+0

Фактическое имя файла - sw_events.log, но спасибо за предложение. – user2435542

Смежные вопросы