Любой способ выхода из скрипта bash, но не выхода из терминала

2. Использование Tmux (мультиплексора терминалов) чтобы программа работала после отключения от SSH

Tmux — это ещё одна программ, которая создана на замену screen. В ней имеется большинство возможностей screen, а также несколько дополнительных функций, которые делают её более мощной чем screen.

Она позволяет, кроме всех других опций, которые предлагает screen, разделение экрана терминала по горизонтали и вертикали, чтобы иметь сразу несколько консолей, позволяет изменять размер этих панелей, имеется мониторинг активности сессий, поддержка скриптов используя режим командной строки и т. д. Благодаря этим функциям tmux, он имеется практически во всех дистрибутивах Unix и даже был включён в базовую систему OpenBSD.

9 ответов

Лучший ответ

Я бы не стал делать такие вещи прямо в коде. Я бы написал инструмент, который анализировал файл проекта (vcproj, makefile или даже просто сканировал каталог проекта на наличие файлов * .c *) и генерировал дополнительный исходный файл C, который содержал имена всех исходных файлов в каком-то предварительном виде. инициализированная структура данных.

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

4

Ferruccio
6 Мар 2009 в 11:56

Я согласен с Ферруччо, лучший способ сделать это — в системе сборки, а не в самом коде. В качестве расширения его идеи добавьте цель в вашу систему сборки, которая выгружает список файлов (который она в любом случае должна знать) в файл C в виде строки или массива строк и компилирует этот файл в ваш источник. Это позволяет избежать большого количества сложностей в исходном коде и может быть расширено, если вы хотите добавить дополнительную информацию, такую ​​как номер версии из вашей системы управления исходным кодом, кто создал исполняемый файл и т. Д.

2

KeithB
6 Мар 2009 в 12:17

В UNIX и Linux есть стандартный способ — . Для каждого исходного файла вы создаете тег ID — обычно он назначается вашей системой контроля версий, например .

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

2

qrdl
6 Мар 2009 в 12:49

В C нет возможности сделать это. В C ++ вы можете создать такой класс:

Где StaticDictionary — одноэлементный контейнер для всех имен ваших файлов. Затем в каждом исходном файле:

Вы хотите сделать словарь Meyers, чтобы избежать проблем с порядком создания.

1

anonanon
6 Мар 2009 в 11:58

Я не думаю, что вы можете сделать это так, как вы делаете наброски в «пассивном» режиме. То есть вы собираетесь как-то запускать код для каждого исходного файла, который будет добавлен в реестр, сложно заставить это происходить автоматически.

Конечно, можно сделать этот код очень ненавязчивым с помощью макросов. Это может быть проблематично для исходных файлов C, у которых нет «точки входа», поэтому, если ваш код еще не организован как «модули», например, функция для каждого модуля, это может быть сложно. Статическая инициализация кода может быть возможна, я не уверен на 100%, что порядок, в котором инициализируются вещи, создает здесь проблемы.

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

unwind
6 Мар 2009 в 11:57

На C ++ ваше решение будет работать. Это гарантировано.

Изменить: Только что нашел решение в моей голове: измените правило в своем make-файле, чтобы добавить ‘-включить cfiles_register.h’ в каждый файл ‘g ++ file.cpp’.

Поместите ваше предложение в вопрос о реализации этого файла cfiles_register.h.

Mykola Golubyev
6 Мар 2009 в 12:08

Использование статических экземпляров в C ++ подойдет.

Вы можете сделать это также на C, но вам нужно использовать специальные функции времени выполнения — для MSVC CRT посмотрите http://www.codeguru.com/cpp/misc/misc/threadsprocesses/article.php/c6945/

Для C — вы можете сделать это с помощью макроса — определите переменную с именем, соответствующим вашему файлу, а затем вы можете сканировать символы вашего исполняемого файла, как идея:

Используйте его в своем my_c_file.c следующим образом:

И затем grep все имена файлов / переменных из двоичного файла, как это

Не очень хорошо, но …

siddhadev
6 Мар 2009 в 12:48

Ужасная идея, я уверен, но используйте синглтон. И для каждого файла сделайте что-нибудь вроде

В глобальном масштабе. Однако он будет работать только с файлами cpp. Я сделал что-то подобное много лет назад, будучи новичком, и это сработало. Но мне бы хотелось сделать это сейчас. Я бы добавил шаг сборки сейчас.

Robert Gould
6 Мар 2009 в 13:02

Я согласен с теми, кто говорит, что лучше избегать этого во время выполнения, но в C вы можете инициализировать статическую переменную с помощью вызова функции, то есть в каждом файле:

dmityugov
6 Мар 2009 в 14:38

1 — данные в плохом секторе и не могут прочитать файл с источника или диска

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

  1. Сначала выберите диск, с которого вы копируете
  2. Щелкните диск правой кнопкой мыши и выберите «Свойства».
  3. Затем выберите Инструменты и нажмите Проверить и разрешите сканирование диска.


При появлении запроса введите пароль администратора.
Теперь вы можете запустить инструмент проверки на рабочем месте. Он предоставляет два варианта проверки диска

Выберите вариант и нажмите Пуск.
Повторите эти же действия для целевого диска.

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

Запустите проверку диска из командной строки —

  1. Откройте командную строку (от имени администратора).
  2. Введите команду — chkdsk / f F: и нажмите Enter.
  3. Теперь приступим к процессу.

Если есть сбойный сектор, он будет восстановлен, и теперь Windows сможет переместить файл.

Иногда эта ошибка возникает из-за разрешения файла. Windows не предоставляет вам право собственности на файл, потому что вы не можете переместить этот файл из одного места в другое, и вы получили сообщение об ошибке: не удается прочитать исходный файл или диск. Чтобы устранить эту проблему, вы должны дать операционной системе полное разрешение на перемещение этого файла.

Следуйте приведенным ниже инструкциям, чтобы исправить эту проблему —

  1. Выберите файл, который вы хотите переместить, щелкните его правой кнопкой мыши и выберите свойства.
  2. Выберите «Безопасность» и нажмите «Изменить».
  3. Нажмите «Добавить».
  4. Введите имя пользователя в поле Введите имена объектов для выбора и щелкните по именам проверки.
  5. Выберите ОК.
  6. Теперь выберите свое имя пользователя, затем установите флажок полного контроля.
  7. Выберите Применить, а затем ОК.

Теперь Windows позволяет перемещать файл из одного места в другое.

Вывод

Иногда вы получали ошибку «не удается прочитать из исходного файла или диска» из операционной системы Windows, из-за этой ошибки вы не можете переместить данные из одного места в другое. Вы должны исправить эту ошибку, чтобы передавать файл между дисками. В приведенном выше разделе мы рассмотрели некоторые причины этой ошибки, и данное решение поможет вам устранить эту ошибку.

Выполните чистую загрузку

Когда вы запускаете ОС Виндовс в обычном режиме, несколько приложений и служб запускаются автоматически, и далее работают в фоновом режиме. Эти программы включают в себя базовые системные процессы, антивирусы, системные служебные программы и другой релевантный софт. Все эти приложения и службы могут вызывать конфликты программного обеспечения.

Рекомендуем для запуска Виндовс выполнить чистую загрузку с использованием минимума драйверов. Осуществите следующее:

  1. Нажмите на клавиши Win+R;
  2. В открывшемся окне наберите и нажмите на клавишу Энтер;
  3. В открывшемся окне перейдите на вкладку «Службы» и поставьте галочку рядом с опцией «Не отображать службы Майкрософт»;

  4. Далее нажмите на «Отключить всё» — «Ок»;
  5. Затем перейдите во вкладку «Автозагрузка» — «Открыть Диспетчер задач»;

  6. Отключите все имеющиеся там программы автозагрузки, наведя курсор на нужную программу, кликнув правую клавишу мышки, и выбрав «Отключить»;

  7. Нажмите на «Ок»,  и перезагрузите ваш ПК;

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

Команда wait Bash

Общий синтаксис имеет следующий вид:

— это идентификатор процесса или задания. Если не указан, команда ожидает завершения всех дочерних фоновых заданий.

Команда возвращает статус выхода последней ожидаемой команды.

Например, чтобы дождаться фонового процесса с PID , вы должны использовать:

Когда задано несколько процессов, команда ожидает завершения всех процессов.

Задания указываются с использованием спецификации задания («спецификация задания»), которая является способом ссылки на процессы, составляющие задание. Спецификация задания начинается с символа процента, за которым следует номер задания ( ). Вот пример:

Выполните команду в фоновом режиме :

Идентификатор задания оболочки (в скобках) и идентификатор процесса будут отображаться на вашем терминале:

Чтобы дождаться задания, запустите команду за которой следует спецификация задания:

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

В приведенном выше примере выводит только статус возврата задания, которое завершается первым; он не показывает PID задания. Если вы хотите получить идентификатор задания или спецификацию задания, для которого возвращается статус выхода, используйте параметр чтобы присвоить его переменной:

был представлен в Bash 5.1. Если вы используете старую версию Bash, вы получите ошибку «неверный вариант».

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

Предкомпилированные заголовки еще не скомпилированы

Если проект настроен для использования предварительно скомпилированных заголовков, необходимо создать соответствующие файлы, чтобы можно было скомпилировать файлы, использующие содержимое заголовка. например, файл ( в Visual Studio 2017 и более ранних версий) автоматически создается в каталоге проекта для новых проектов. Сначала необходимо скомпилировать этот файл, чтобы создать предкомпилированные файлы заголовков. В типичном проекте процесса сборки это выполняется автоматически. Дополнительные сведения см. в разделе Создание предкомпилированных файлов заголовков.

Основы о процессах в Linux

Нормальные процессы

Нормальные процессы это те, у которых продолжительность жизни ограничивается сеансом. Они запускаются во время сессии как процессы переднего плана и завершаются через определённое время или когда сессия прекращается из-за выхода пользователя. Эти процессы имеют своего владельца, которым является любой валидный пользователь системы, включая root.

Осиротевшие процессы

Осиротевшие процессы это те, которые изначально имели родительский, создавший их процесс, но после некоторого времени родительский процесс непреднамеренно завершил работу или остановился из-за ошибки, что сделало init родителем данного процесса. Такие процессы имеют init в качестве их непосредственного родителя, который ожидает от этих процессов остановки или завершения их работы.

Процессы демонов

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

Техники для сохранения запущенной SSH сессии после отключения

Могут быть различные способы оставить ssh сессию запущенной после отключения, они описаны далее:

Подробная информация и пример тестового кода

Не существует ответа, показывающего как правильный ответ, но он должен быть, так что вот он. Этот ответ частично заимствован из ответа @ Karsvo , ответа @Stefano Palazo и комментария @Andrea Corbellini под ответом Стефано.

В моей системе (последний раз проверялся и проверялся) в Ubuntu 20.04), показывает, что переменная SHELL содержит . Однако показывает, что исполняемый файл находится в . НО, и являются идентичными исполняемыми файлами, что подтверждается наличием одинаковых :

Следовательно, использование вместо идентичен. Кроме того, я определил, что все три из них в конце будут держать терминал открытым: , , , , но только последний, , позволит вам закрыть терминал без предупреждения о том, что процесс все еще запущен. Поэтому лучше всего использовать или , как говорит @AndreaCorbellini в своем комментарии.

Тест 1: это будет работать, как ожидалось

Вот что это может выглядеть так в случае использования сценария для открытия двух новых вкладок, уже ed в вашем каталоге :

Добавьте в конец вашего файла:

ИЛИ: опять же, вы можете использовать вместо этого:

Затем в любой gnome-terminal уже открыт, переустановите свой файл с , затем запустите эту команду с:

… и вы увидите исходную вкладку gnome-terminal плюс две новые вкладки, причем обе две новые вкладки уже ed в каталог .

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

Тест 2: это доказывает, что работает. НО, поведение не совсем такое, как ожидалось. Чтобы решить эту проблему, см. Мои более-сложный ответ и обходной путь .

Дополнительные причины

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

  • Файл использует управляемый код, но параметр компилятора не указан. Дополнительные сведения см. в разделе (компиляция среды CLR).

  • Файл компилируется с использованием другого параметра компилятора, чем используется для предварительной компиляции заголовков. При предварительной компиляции заголовков для проекта все должны использовать одни и те же Параметры. дополнительные сведения см. в разделе (Code Analysis).

  • файл или каталог был создан подсистема Windows для Linux, учитывается регистр в каждом каталоге, и указанный регистр пути или файла не соответствует регистру пути или файла на диске.

  • Файл, каталог или диск доступен только для чтения.

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

  • Недостаточно дескрипторов файлов. Закройте часть приложений и повторите компиляцию. Эта ситуация маловероятна в обычных условиях. Однако она может возникать при построении крупных проектов на компьютере с ограниченной физической памятью.

Не удается прочитать из исходного файла или диска из-за плохих секторов

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

Термин «плохие сектора» относится к ошибке в вашей ОС. Данные, относящиеся к большому файлу, который вы пытаетесь переместить, могут присутствовать в нескольких сегментах. И, если ОС не может прочитать данные в одном или нескольких из этих сегментов, их нельзя переместить. В основном это связано с ошибками программного обеспечения (ОС). Но в очень редких случаях такие случаи могут возникать и из-за физических дефектов.

  • Прежде всего, выберите жесткий диск, на котором сохранен оригинальный файл.
  • Теперь щелкните правой кнопкой мыши на том же диске и перейдите в Свойства.
  • Перейдите на вкладку Инструменты под этой опцией.
  • Затем вы должны поставить галочку напротив «Проверка ошибок».
  • Теперь убедитесь, что процесс завершен.
  • Вы должны сделать то же самое с целевым диском.

Фактически, инструмент, используемый для проверки диска, встроен в вашу ОС. Этот инструмент может сообщить вам, есть ли на жестком диске поврежденные сектора. Помимо поиска поврежденных секторов, этот же инструмент можно использовать для исправления ошибок. В большинстве случаев этот инструмент может успешно исправить потенциальные ошибки. Однако вы должны знать, что этот процесс может повредить файл, который вы собираетесь переместить

Поэтому делать это нужно осторожно и знать о последствиях

Чтобы запустить проверку диска, вы даже можете использовать командную строку.

  • Запустите CMD в режиме администратора.
  • Введите термин chkdsk / f (D) и нажмите ввод. D следует заменить на соответствующее имя диска без скобок.
  • Завершите процесс.
  • Если бы присутствовали плохие сектора, Windows могла бы это исправить.

Не удается прочитать из исходного файла или с диска из-за проблем с правами доступа к файлу

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

Хорошей новостью является то, что эту проблему можно решить очень легко.

  • Щелкните правой кнопкой мыши файл, который вы собираетесь переместить на новый диск.
  • Затем выберите опцию Свойства.
  • Выберите вкладку «Безопасность» и перейдите к опции «Изменить».
  • Выберите кнопку под названием Добавить.
  • Введите имя пользователя компьютера в поле, которое находится внизу.
  • Также выберите опцию Проверить имена.
  • Теперь вы должны выбрать ОК.
  • Выберите имя пользователя, которое можно найти в верхней части окна. Установите флажок рядом с полным контролем.
  • Выберите Применить и нажмите ОК.

Это оно!

3. Использование команды nohup чтобы программа не закрывалась после отключения от SSH

Если вы не особо знакомы со screen или tmux вы можете использовать nohup и отправить вашу долго выполняющуюся команду в фон, чтобы вы могли продолжать работать в терминале, пока команда будет выполняться в фоне. Также при переводе команды в фон вы можете отключиться от удалённой системы, не опасаясь, что запущенная программа будет остановлена.

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

Выполнение команды в фоне используя nohup

Это простой сценарий в котором во время сессии SSH мы запустили команду find для поиска файлов в фоне используя nohup. При отправке работы в фон в приглашение терминала возвращается JOBID и PID процесса.

nohup find / -type f $gt; files_in_system.out 2>1 &

Возобновление сессии для просмотра всё ещё работающей задачи

Когда вы повторно залогинитесь, вы можете проверить статус команды, вернув её на передней план:

fg %JOBID

%JOBID — это цифра в квадратных скобках, например , тогда для перевода её на передней план введите:

fg 1

Если программа уже завершила свою работу, то вы увидите что-то вроде:

bash: fg: 1: нет такого задания

По умолчанию программа также сохраняет свой вывод в файл nohup.out — в противном случае, после завершения программы уже не получится вернуть данные, которые вывела программа.

При переводе на передний план программа не показывает свой вывод — в этом состоянии её можно только остановить комбинацией CTRL+c.

Подробности о nohup смотрите в статье «Как закрыть терминал без убийства запущенной в нём команды».

Запуск сессии Tmux

После подключения к удалённому хосту по SSH, наберите в командной строке:

tmux

Вы откроете новую сессию с новым окном — здесь вы можете делать всё что угодно как в обычном терминале.

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

Отсоединение сессии Tmux от терминала

В запущенной сессии tmux вы можете набрать:

tmux detach

Либо вы можете использовать сочетание клавиш, нажмите Ctrl+b, а затем нажмите d. После этого ваша текущая сессия будет отсоединена и вы вернётесь в ваш терминал, который вы можете безопасно закрыть (отключиться от SSH).

Возобновление фоновой сессии Tmux

Чтобы повторно открыть сессию, которую вы отсоединили и вернуть всё в то состояние, в котором находился терминал до того, как вы отключились от системы, просто повторно залогинтесь на удалённую машину и наберите

tmux attach

чтобы подсоединить закрытую сессию. Она вернётся, и запущенная в ней программа будет работать как прежде.

Чтобы узнать больше о tmux, о его возможностях и других командах и комбинациях клавиш, смотрите статью «Как пользоваться tmux для создания нескольких терминалов внутри одной консоли».

Параллельное выполнение и ограничение количества фоновых задач в скрипте

Давайте рассмотрим такую практическую задачу — запустить 100 процессов параллельно, но так, чтобы работало одновременно не более 10 процессов. В общем, достаточно простая задача. Предположим, что все процессы работают произвольное количество времени. Пусть запуск одной задачи будет выглядеть как запуск команды sleep со случайным параметром от 0 до 29. Тогда скрипт будет выглядеть следующим образом:

#!/bin/bash

RANDOM=10
JOBS_COUNTER=0
MAX_CHILDREN=10
MY_PID=$$

for i in {1..100}
do
    echo Cycle counter: $i
    JOBS_COUNTER=$((`ps ax -Ao ppid | grep $MY_PID | wc -l`))
    while 
    do
        JOBS_COUNTER=$((`ps ax -Ao ppid | grep $MY_PID | wc -l`))
        echo Jobs counter: $JOBS_COUNTER
        sleep 1
    done
    sleep $(($RANDOM % 30)) &
done
echo Finishing children ...
# wait for children here
while 
do
    JOBS_COUNTER=$((`ps ax -Ao ppid | grep $MY_PID | wc -l`))
    echo Jobs counter: $JOBS_COUNTER
    sleep 1
done
echo Done

Смысл этого скрипта в целом такой: ограничиваем максимально число дочерних фоновых процессов так, чтобы их одновременно было не более 10. Как только один процесс заканчивает свою работу, запускаем следующий. И так далее, пока не выполним 100 фоновых задач. Для порядка отслеживаем в скрипте окончание работы дочерних процессов после запуска последних,  только потом заканчиваем работу самого скрипта.

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

Совет от профессионала: восстановите файл с помощью EaseUS Data Recovery Wizard

Иногда ваш компьютер не может скопировать или переместить файл только потому, что файл поврежден. В этом случае ОС не может идентифицировать файл, и, как следствие, с ним ничего нельзя сделать. На самом деле файлы могут быть повреждены по разным причинам. Независимо от причины файл необходимо восстановить, чтобы переместить или использовать каким-либо другим способом. Однако правда в том, что вы не можете исправить поврежденный файл вручную. Для этого у вас должно быть профессиональное программное обеспечение, такое как EaseUS Data Recovery Wizard.

Особенности EaseUS Data Recovery Wizard

  • Он может восстановить данные, которые полностью потеряны из-за форматирования, удаления или даже из-за сбоя жесткого диска.
  • Он может восстанавливать файлы различных типов, начиная от тяжелых видеофайлов до простых документов.
  • EaseUS Data Recovery может восстанавливать (восстанавливать) файлы с любых носителей (USB, HDD, карт памяти, камер, телефонов и т. Д.).

Мы надеемся, что описанные выше методы помогут вам решить «Не могу прочитать из исходного файла или диска» ошибка.

Использование фонового режима

Для организации параллельной работы нескольких программ часто используется запуск в фоновом режиме при помощи знака амперсанда — &. Например:

command1 &

Команда будет работать в фоне, при этом из текущей оболочки можно выполнять команды. Таким образом уже можно распараллелить какие-то действия. Можно запустить сразу несколько команд таким образом и дождаться, пока они все отработают. Для ожидания запущенных дочерних процессов используется команда wait. Эта команда без параметров ожидает окончания работы всех дочерних процессов, соответственно, для ожидания окончания 5 процессов понадобится выполнить команду всего 1 раз. В принципе, это легко реализуется через цикл. Например, так:

for i in {1..5}
do
    # запуск одного фонового процесса
    sleep 10 && echo $i &
done
# ожидание окончания работы
wait
echo Finished

И результат работы этого скрипта:

$ ./wait5.sh
1
5
4
2
3
Finished

Как видите, с виду одинаковые команды завершились не в том порядке, в котором мы их запустили. Давайте посмотрим теперь общее время выполнения скрипта.

$ time ./wait5.sh 
4
5
2
3
1
Finished

real	0m10.029s
user	0m0.000s
sys	0m0.008s

Общее время работы скрипта чуть больше 10 секунд, что доказывает, что наши команды выполнились параллельно, а увеличение времени выполнения говорит о том, что они были запущены не в одно и то же время, были небольшие таймауты между запусками. Но они были очень маленькими, поэтому такой запуск пяти процессов занимает практически такое же время, как запуск одного.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Adblock
detector