Вопрос по поводу /opt/etc/init.d/rc.unslung

Используем пакеты, расширяющие возможности оборудования
kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 20 дек 2017, 01:02

Похоже как-то так надо:

Код: Выделить всё

for i in $(/opt/bin/find /opt/etc/init.d/ -perm '-u+x' -name 'S*' | sort "-r" ) ;
        do
            case "$i" in
               /opt/etc/init.d/S* | *.sh  )
                    # Source shell script for speed.
                    echo "." $i $ACTION $CALLER
                    ;;
                *)
                    # No sh extension, so fork subprocess.
                    $i $ACTION $CALLER
                    ;;
            esac
        done

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

nick7inc
Сообщения: 12
Зарегистрирован: 08 май 2017, 15:59

Сообщение nick7inc » 20 дек 2017, 11:50

Всем спасибо. Я у себя всё же поправлю.

nick7inc
Сообщения: 12
Зарегистрирован: 08 май 2017, 15:59

Сообщение nick7inc » 20 дек 2017, 12:14

kaztost писал(а):Источник цитаты во втором случае вызывается другой шелл-сеанс

Source vs fork().
When you call source (or its alias .), you insert the script in the current bash process. So you could read variables set by the script.

When you call sh, you initiate a fork (sub-process) that runs a new session of /bin/sh


Если почитать статью про fork():
После fork() процесс-потомок чаще всего выполняет системный вызов exec(), загружающий в пространство процесса новую программу (именно так, и только так, в Unix-системе выполняется запуск программы в отдельном процессе).

Некоторые программы создают дочерние процессы не для запуска другой программы, а для выполнения параллельной задачи.

Вызов fork() выполняется довольно долго, так как требует копирования большого количества данных.

IMHO, всё же есть разница (хотя другой вопрос, как часто она будет проявляться, в т.ч. и в зависимости от загрузки ЦПУ, кол-ва ядер). Вполне возможно "застревание" и "запараллеливание" вызова через fork(). Другое дело - через source, где ожидание завершения гарантировано.

kaztost
Сообщения: 223
Зарегистрирован: 17 июл 2017, 00:29

Сообщение kaztost » 20 дек 2017, 23:33

nick7inc писал(а):Источник цитаты После fork() процесс-потомок чаще всего выполняет системный вызов exec(),

Ну да, вроде действительно так, запуск дочернего процесса идет через fork. Я имел в виду, что простой sh по сути не распараллеливает, поскольку родительский шелл ждет результаты дочернего. В отличие от конструкции (...) &


Вернуться в «Entware/Qnapware/Optware/Zyxware - обсуждаем репозитории пакетов»

Кто сейчас на конференции

Всего 6 посетителей :: 0 зарегистрированных, 0 скрытых и 6 гостей (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (162) здесь было 16 ноя 2019, 18:33

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей