[
] Для вашего конкретного сценария будет работать в любом случае, за исключением того, что []./script.sh[
] требует исполняемых и читаемых битов, в то время как []bash script.sh[
] требует только читаемых битов.[
] [
] [
]Причина разницы в требованиях к разрешениям заключается в том, как загружается программа, интерпретирующая ваш сценарий:[
] [
]. /script.sh[
] заставляет оболочку выполнять файл так, как если бы он был обычным исполняемым файлом.[] [
]Оболочка вилкирует себя и использует системный вызов (например, []execve[
]), чтобы заставить операционную систему выполнить файл в процессе вилки. Операционная система проверит права доступа к файлу (следовательно, бит выполнения должен быть установлен) и перешлет запрос загрузчику программы [] [], который посмотрит на файл и определит, как его выполнить. В Linux скомпилированные исполняемые файлы начинаются с магическим номером []ELF[], в то время как скрипты начинаются с []#![
] ([]hashbang[]). Заголовок хэшбэнга означает, что файл является скриптом и должен быть интерпретирован программой, которая указана после хэшбэнга. Это позволяет самому скрипту указывать системе, как интерпретировать скрипт.[
] [
]Загрузчик программы выполнит []/bin/bash[
] и передаст []./script.sh[
] в качестве аргумента командной строки.[
] [
]bash скрипт. sh[
] заставляет ваш оболочку выполнить []bash[
] и передать []script.sh[
] в качестве аргумента командной строки[] [
] Так что операционная система загрузит []bash[
] (даже не глядя на []script.sh[
], потому что это просто аргумент командной строки). Созданный процесс []bash[
] затем интерпретирует []script.sh[
], потому что он передаётся в качестве аргумента командной строки. Так как []script.sh[
] читается только []bash[
] как обычный файл, бит выполнения не требуется.[
] [
] [
] Тем не менее, я рекомендую использовать []./script.sh[
], потому что вы можете не знать, какой интерпретатор необходим для работы скрипта. Так пусть загрузчик программы определит это за вас.[
].
Как заявил Муру, , приятно
только контролирует процессорное планирование. Вы сами отмечали, что использование ЦП было только около 5% в то время. Это означает, что система была сильно связана с IO, означающая чтение / запись дисков было узким местом.
Вы можете управлять приоритетом IO, приведенным к процессу через команду Ionice
. Вы можете поставить процесс в одном из трех классов планирования:
, вы можете указать класс с опцией
, 1 = Realtime, 2 = Best-Heife, 3 = простаивает.
С наилучшими усилиями и в реальном времени также есть 8 различных уровней приоритетов, для тонкой настройки среди процессов одного и того же класса.
Я обычно выполняет команды, такие как TAR
или rsync
с Ionice -C3
, то есть самый низкий класс «холостой». Таким образом, другие процессы не голодают от доступа к диску.
Обратите внимание, что IMHO Ionice
работает лучше всего с планировщиком CFQ I / O (параметр ядра).
Возможно, поведение, которое вы наблюдаете, являются детали реализации вашей файловой системы - это может собрать много данных в память и написать его навалом. Простейший способ разрешить это - снизить объем данных, которые вы хотите написать =).Я бы сильно предположил, чтобы избежать проблемы, просто немедленно достичь вашего файла. Нет смысла в хранении безоговорочной смолы, если вы диск медленно. Чтобы создать архив, просто Add -z на вашу командную строку TAR: TAR RZF 2014-12.tar.gz 2014-12 - *. Журнал
. Лучше использовать GZIP в большинстве случаев, поскольку он использует действительно несколько процессоров в оба сжимании, так и в декомпании. Этот подход уменьшит время создания TAR в 10 или 20, а также уменьшить объем данных для записи файловой системы такими же фактором.
Я также отметил бы, что ежедневное ручное Tarring - это рода странная идея. Я предлагаю вам настроить нормальную работу Logrory и Cron / AnaCron, поэтому система автоматически сделает все эти вещи для вас.
Какую файловую систему у вас кстати? (Использование Mount | GreeP $ (Stat --PrintF "% m".)
)