На Linux команда удаления "rm" выполняется в фоновом режиме? - PullRequest
1 голос
/ 06 января 2020

Я пытаюсь запустить свои тестовые случаи, которые почти 40 КБ с приведенными ниже сценариями.

Просто показываю некоторую часть сценария -

#!/bin/bash
# RUN script



echo "please run with: nice nohup ./run_script"

# working directory where script is stored
WORKING_DIR=$(pwd)

# temp directory to build and run the cmake ctest
BUILD_DIR=${BUILD_DIR:-/localtemp/build}

# clean and make build directory
rm -rf $BUILD_DIR
mkdir -p $BUILD_DIR
mkdir -p $BUILD_DIR/../result

cmake -G Ninja

ninja test

Примечание: я использую параллельную многопоточность для 6 тестов.

При первой попытке все проходят, что верно, так как я исправил все ошибки в своих тестах.

Но когда-нибудь, если я захочу заново запустить тот же самый скрипт, я получаю ошибку при запуске некоторых тестовых случаев из 40k. Но если я запускаю эти неудачные тесты отдельно (по одному), то они проходят отлично.

Итак, я предположил, что rm -rf требуется некоторое время, чтобы удалить этот старый двоичный файл и символы всех случаев (файлы 40 ГБ). поэтому мне нужно дождаться полного удаления, а затем снова запустить мой скрипт. Поэтому я должен добавить некоторую задержку после команды rm -rf в моем скрипте.

Я где-то читал, что rm -rf вернет статус, когда он завершит работу. Затем будет выполняться только следующая команда. Но мой scnerio выглядит так, как будто он показывает, что rm -rf работает в фоновом режиме.
Означает, что я не должен начинать новый запуск немедленно, когда я остановил предыдущий запуск. Мне нужно дать некоторое время, чтобы удалить старый вывод из более раннего запуска, используя команду rm -rf в скрипте (задержка введения) и после этого запустить мою команду ниже ninja. Это правда?

Ответы [ 2 ]

1 голос
/ 06 января 2020

Это немного сложнее, чем это. rm не будет работать в фоновом режиме. Что несомненно, так это то, что удаление выполняется, по крайней мере, логически (таким образом, с точки зрения пользователя, вещи удаляются); это означает, что в некоторых операционных системах возможно, что низкоуровневое удаление выполняется в ядре, даже если команда завершилась (ядро действительно очищает некоторые внутренние структуры за вашей спиной). Но это обычно не должно мешать вашему сценарию. Ваша проблема наверняка в другом месте.

Возможно, некоторые процессы удерживают некоторые файлы, даже если они кажутся удаленными ... Таким образом, диск может быть освобожден не так, как вы ожидали. Затем вам придется приостановить выполнение этих процессов, чтобы ядро ​​действительно очистило файлы ...

1 голос
/ 06 января 2020

Редактировать: Похоже, что, хотя на общий вопрос легко ответить (т. Е. rm не работает в фоновом режиме), конкретная проблема, с которой вы сталкиваетесь, является более сложной и требует некоторой потенциальной ОС. отладка уровня. Никто в StackOverflow не сможет сделать это за вас: D

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


Первоначальный ответ:

Команда rm будет не выполняться "в фоновом режиме" или каким-либо образом одновременно с другими командами в вашем сценарии, если вы явно не скажете это (например, с помощью & в конце команда). По завершении (т. Е. Выполнение следующей команды в вашем скрипте bash) файлы должны быть удалены. Таким образом, ваша проблема, вероятно, кроется где-то еще.

При этом может возникнуть разница в поведении, если, например, вы используете сетевые папки, файловые системы FUSE или любой другой механизм, который изменяет, как или когда ваша файловая система реагирует на запрос на удаление операционной системой.

...