Intereting Posts
Как создать веб-страницы в моем домашнем каталоге и настроить веб-сервер в своем веб-браузере? Является ли использование исходного файла, уже полученного в родительском скрипте, необязательным? Как удалить префикс из нескольких файлов в каталоге Как планировщик ядра знает, как опередить процесс? Видео Youtube становятся Choppy Когда Maximized Перенаправить все ARP-трафик с eth0 на eth1 Установка Linux Mint на Windows-Ubuntu с двойной загрузкой как rsync определенный каталог и файлы – проблема Многократные скрининг в гольф Приложения Qt имеют крошечные шрифты на XFCE Приложение Java блокируется после воспроизведения звука Что делать, если я не могу найти файл ssl.conf на сервере CentOS? Открыть файл с запущенным vim извне (в терминале) можно ли предположить, что мои используемые команды существуют по умолчанию почти со всеми дистрибутивами нужна помощь при загрузке машины с помощью установочного компакт-диска Ubuntu 10.04

назначение утилиты run-parts (8)

По крайней мере, в системах на базе Debian в пакете debianutils есть утилита run-parts которая используется в различных сценариях. Например, в / etc / X11 / Xsession. Он запустит все исполняемые файлы, найденные в каталоге. Почему требуются детали, необходимые для find с -perm опции -perm или утилиты test ? Кроме того, что run-parts рассматриваются как исполняемый файл? Похоже, он не просто проверяет права доступа к файлам:

 # run-parts --list --lsbsysinit /etc/X11/Xsession.d | tail -1 /etc/X11/Xsession.d/90x11-common_ssh-agent # ls -l /etc/X11/Xsession.d/90x11-common_ssh-agent -rw-r--r-- 1 root root 629 2010-11-02 23:17 /etc/X11/Xsession.d/90x11-common_ssh-agent # head /etc/X11/Xsession.d/90x11-common_ssh-agent # $Id: 90x11-common_ssh-agent 305 2005-07-03 18:51:43Z dnusinow $ # This file is sourced by Xsession(5), not executed. STARTSSH= SSHAGENT=/usr/bin/ssh-agent SSHAGENTARGS= if has_option use-ssh-agent; then if [ -x "$SSHAGENT" ] && [ -z "$SSH_AUTH_SOCK" ] \ # 

Вы можете использовать find вместо run-parts , нет способа показать, какой из них лучше. Но я думаю, что использование run-parts короче (меньше ввода) и сделать ваш скрипт более удобным. Пример: /etc/crontab :

 # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # mh dom mon dow user command 17 * * * * root cd / && run-parts --report /etc/cron.hourly 25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) 47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) 52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) 

Для второго вопроса вы можете найти ответ в исходном коде debianutils . В файле run-parts.c строка 198:

 /* Execute a file */ void run_part(char *progname) { .... args[0] = progname; execv(progname, args); error("failed to exec %s: %s", progname, strerror(errno)); exit(1); .... } 

Вы можете увидеть run-parts используя системный вызов execv . Поэтому, если ваш файл не является двоичным исполняемым или Interpreter script , execv не может запустить файл.

Заметка

  • Что такое Interpreter script :

Из man execve , section Interpreter scripts :

 Interpreter scripts An interpreter script is a text file that has execute permission enabled and whose first line is of the form: #! interpreter [optional-arg] The interpreter must be a valid pathname for an executable which is not itself a script. If the filename argument of execve() specifies an interpreter script, then interpreter will be invoked with the following arguments: interpreter [optional-arg] filename arg... where arg... is the series of words pointed to by the argv argument of execve(). For portable use, optional-arg should either be absent, or be specified as a single word (ie, it should not contain white space); see NOTES below. 
  • Здесь вы можете увидеть исходный код debianutils.

Файлы, run-parts пробеги, достаточно хорошо документированы. В дополнение к тому, что они исполняются, следующий фрагмент справочной страницы объясняет требования:

 If neither the --lsbsysinit option nor the --regex option is given then the names must consist entirely of ASCII upper- and lower-case letters, ASCII digits, ASCII underscores, and ASCII minus-hyphens. If the --lsbsysinit option is given, then the names must not end in .dpkg-old or .dpkg-dist or .dpkg-new or .dpkg-tmp, and must belong to one or more of the following namespaces: the LANANA-assigned namespace (^[a-z0-9]+$); the LSB hierarchical and reserved namespaces (^_?([a-z0-9_.]+-)+[a-z0-9]+$); and the Debian cron script namespace (^[a-zA-Z0-9_-]+$) 

Использование опции --lsbsysinit особенно полезно для запуска скриптов в /etc поскольку многие из скриптов будут перечислены как conffiles в своих соответствующих пакетах. Обычный случай, когда файлы с расширением dpkg-* создаются, – это когда изменения были внесены в установленную версию, а dpkg пытается установить новую версию. Обычно dpkg хранит версию, которую пользователь не выбрал в том же каталоге. Использование run-parts – это хороший стандартный способ гарантировать, что ни одно из этих расширений или любых других, которые не предназначены для запуска, не являются. Это уменьшает вероятность появления ошибок, потому что разработчик забыл включить один из них в свой скрипт.

Даже без --lsbsysinit , по-прежнему полезной командой является сокращение количества кода, который необходимо записать, и повышения надежности при использовании в системе. Хотя не так много, как проще заменить с помощью find ... -executable -exec {} ; или т.п.

 Why is run-parts needed while one could use find with -perm option or test utility? 

Это просто по дизайну. Как вы можете видеть на странице run-parts , run-parts также имеет ряд опций. Все вещи также могут быть записаны в оболочке.

[Редактировать]

Вероятно, он был реализован на C, чтобы предотвратить взлом.