Автозагрузка Linux | Losst
После запуска компьютера, как правило, нам приходится запускать некоторые программы. которыми мы пользуемся чаще всего. Также после запуска системы нам может понадобиться выполнить какие-либо специфичные действия, например, создать нужные файлы или установить некоторые параметры. Очень неудобно делать это вручную. Для решения таких задач существует автозагрузка.
В этой статье мы рассмотрим как работает автозагрузка Linux, как добавить программы автозагрузки, куда их будет более правильно добавить, а также какие виды автозагрузки бывают в этой операционной системы.
Содержание статьи:
Как работает автозагрузка?
Чтобы понять как работает автозагрузка, сначала нужно вспомнить, что происходит во время процесса загрузки Linux. Как только ядро завершит свою инициализацию и будет готово к дальнейшей работе, оно передаст управление системе инициализации. Система инициализации — это основной процесс, именно он запускает все другие процессы в системе.
Есть процессы, которые система инициализации, например, systemd, запускает по умолчанию, но также вы можете настроить чтобы она запускала нужные вам процессы. Также многими дочерними процессами выполняются файлы скриптов или имеется та или иная возможность запускать необходимые вам программы. Такая возможность есть и у большинства окружений рабочего стола.
Рассмотрим основные уровни автозагрузки которые вы можете использовать:
- Автозагрузка на уровне ядра — вы можете указать любую программу, которая будет запускаться после старта ядра вместо системы инициализации;
- Автозагрузка системы инициализации — запуск основных системных сервисов, дополнительных сервисов, а также ваших скриптов на этапе инициализации системы;
- Автозагрузка rc.local — устаревший метод загрузки скриптов, выполняется перед запуском графического окружения;
- Автозагрузка менеджера входа — вы можете выполнять свои скрипты или команды после запуска менеджера входа, но перед запуском окружения;
- Автозагрузка X сервера — запуск нужных программ или скрпитов сразу после старта X сервера;
- Автозагрузка окружения — большинство окружений поддерживают автозагрузку программ, там даже можно настроить отложенный запуск и другие параметры;
- Автозагрузка bash — самый последний вариант — это автозагрузка на уровне отдельной командной оболочки, вы можете выполнять нужные команды автоматически, как только будет запущен терминал.
Дальше мы рассмотрим более подробно как использовать каждый из пунктов для автозагрузки программ, скриптов или выполнения команд в Linux.
Автозагрузка на уровне ядра
Автозагрузка на уровне ядра вряд ли будет вам очень полезной для повседневного применения, но я решил о ней упомянуть, поскольку такая возможность есть. С помощью параметра ядра init вы можете указать какую программу стоит запускать сразу после завершения инициализации ядра. Например, вы можете загрузить оболочку Bash вместо Systemd. Для этого достаточно подправить строку запуска ядра в конфигурационном файле Grub или во время запуска. Добавьте в конец параметр init:
sudo vi /boot/grub2/grub.cfg
linux /vmlinuz-4.8.0-22-generic root=/dev/mapper/systems-ubuntu ro quiet init=/bin/bash
Но, обычно, удобнее изменить это значение временно, в меню Grub. Читайте подробнее об этом в статье параметры ядра Linux. Так не выполняется автозагрузка программы linux, но, тем не менее, иногда может быть полезно.
Автозагрузка в системе инициализации
Чаще всего, когда говорится автозагрузка Linux, подразумевается именно автозагрузка сервисов с помощью системы инициализации. В systemd очень продвинутая система управления службами. Здесь поддерживается разрешение зависимостей, параллельный запуск, отсрочка запуска и перезапуск при ошибке. В терминологии Systemd все запускаемые программы представлены файлами юнитов, в каждом юните описаны параметры программы, ее исполняемый файл, а также дополнительные требования к запуску.
Для добавления или удаления служб из автозапуска используется команда systemctl. Чтобы добавить службу в автозапуск выполните:
А чтобы отключить ее автозапуск linux:
sudo systemctl disable имя_службы
Например, если вы хотите добавить в автозагрузку Apache, то нужно выполнить:
sudo systemctl enable apache
Также вы можете проверить добавлена ли уже служба в автозагрузку:
sudo systemctl is-enabled httpd
Если вы не знаете точное имя файла сервиса, но знаете его первую букву, то можно использовать автодополнение, как и в любом другом месте терминала с помощью кнопки Tab:
Также вы можете посмотреть все сервисы, которые были добавлены в автозагрузку с помощью команды:
systemctl list-unit-files | grep enabled
Автозагрузка скриптов в Linux
Раньше было принято размещать все скрипты, которые запускаются по умолчанию в файле /etc/rc. local. Этот файл все еще существует, но это пережиток системы инициализации SysVinit и теперь он сохраняется только для совместимости. Скрипты же нужно загружать только с помощью Systemd.
Для этого достаточно создать простой юнит-файл и добавить его в автозагрузку, как любой другой сервис. Сначала создадим этот файл:
sudo vi /lib/systemd/system/runscript.service
[Unit]
Description=My Script Service
After=multi-user.target
Type=idle
ExecStart=/usr/bin/local/script.sh
[Install]
WantedBy=multi-user.target
В секции Unit мы даем краткое описание нашему файлу и говорим с помощью опции After, что нужно запускать этот скрипт в многопользовательском режиме (multi-user). Секция Service самая важная, здесь мы указываем тип сервиса — idle, это значит, что нужно просто запустить и забыть, вести наблюдение нет необходимости, а затем в параметре ExecStart указываем полный путь к нашему скрипту.
Осталось выставить правильные права:
sudo chmod 644 /lib/systemd/system/runscript.service
Затем обновить конфигурацию и добавить в автозагрузку Linux новый скрипт:
sudo systemctl daemon-reload
sudo systemctl enable myscript.service
После следующей перезагрузки этот скрипт будет запущен автоматически. Обратите внимание, что для каждого скрипта, который вы собираетесь запускать должны быть правильно выставлены права, а именно нужно установить флаг выполнения. Для этого используйте команду chmod:
sudo chmod u+x /usr/local/bin/script
В параметрах мы передаем утилите адрес файла скрипта. Исполняемость — это обязательный параметр для всех способов.
Автозагрузка X сервера
Часто, в легких окружениях рабочего стола и оконных менеджеров для автозагрузки программ используется автозагрузка на уровне X сервера. Все запускаемые, таким образом, скрипты будут стартовать после запуска X сервера. Чтобы настроить такую автозагрузку Linux вам будет достаточно добавить путь к нужному скрипту в файл ~/.xinitrc или /etc/X11/xinit/xinitrc. Синтаксис добавляемой строки таков:
exec путь_к_скрипту &
Если файла ~/.xinitrc еще не существует, то его нужно создать:
cp /etc/X11/xinit/xinitrc ~/.xinitrc
Затем, чтобы добавить в автозагрузку linux скрипт, отредактируйте файл так, как вам нужно. Например, будем запускать Firefox:
vi ~/.xinitrc
exec /usr/bin/firefox &
Готово. Осталось сохранить изменения. При следующем запуске X сервера сработает автозапуск Linux и выполняется эта команда. Таким же способом может выполняться автозапуск приложений linux.
Автозагрузка окружения рабочего стола
Такие мощные окружения рабочего стола как Gnome и KDE имеют свои приложения для автозагрузки. Например, в Gnome программа называется «Запускаемые автоматически приложения».
Здесь вы видите все программы, которые уже добавлены в автозагрузку. Вы можете отключить каждую из них просто сняв галочку.
Чтобы добавить новую программу или скрипт в автозагрузку нажмите кнопку «Добавить»:
Тут вам нужно заполнить три поля:
- Имя — произвольное имя для команды, по которому вы сможете ее найти;
- Команда — полный путь к исполняемому файлу программы;
- Комментарий — дополнительная информация, указывать необязательно.
Дальше нажмите «Добавить» ваша программа появится в списке. При следующей загрузке системы, будет выполняться автозагрузка программ linux.
Автозагрузка Bash
Самый простой автозапуск скрипта linux — это запуск с помощью bashrc. Ваш скрипт или команда будет выполняться каждый раз, когда запускается новая сессия терминала. Для этого добавьте адрес нужного скрипта в файл ~/. bashrc:
vi ~/.bashrc
/usr/bin/local/script
export MYWAR=test
Здесь вы можете запускать на выполнение любые скрипты или команды. Часто такой подход используется для создания псевдонимов команд, объявления новых переменных и собственных функций.
Выводы
В этой статье мы рассмотрели добавление в автозагрузку linux, а также как работает автозагрузка и ее виды. Конечно, существует множество других файлов, куда бы вы могли пристроить свой скрипт, но это будет неправильно. Нужно использовать только предназначенные для этого методы, хотя бы потому, чтобы потом не забыть. Если у вас остались вопросы, спрашивайте в комментариях!
Управление автозагрузкой сервисов и скриптов в Linux
В данной статье мы рассмотрим основы управлением автозагрузкой сервисов и скриптов в Linux CentOS 7/8. В частности, разберем основы работы с демоном systemd, научимся добавлять в автозагрузку сервисы и убирать их оттуда, а также рассмотрим альтернативные варианты запуска скриптов или демонов после старта системы.
Задача статьи – научить вас быстро разобраться со списками служб и скриптов которые запускаются в Linux автоматически, добавить в автозагрузку свои службы или скрипты, или отключить автозапуск определённых программ.
Systemd: управление автозагрузкой служб в Linux
В большистве популярных современных популярных дистрибутивов Linux (CentOS 7, RHEL, Debian, Fedora и Ubuntu) в качестве демона автозагрузки вместо init.d используется systemd. Systemd – менеджер системы и служб Linux, используется для запуска других демонов и управления ими в процессе работы, использует unit-файлы из /etc/systemd/system (init.d использовал скрипты из каталога /etc/init.d/). Systemd позволяет распараллелить запуск служб в процессе загрузки ОС, тем самым ускоряя запуск.
Для управления system используется команда systemctl.
Для начала, после загрузки системы, мы проверим список юнитов, которые в данный момент добавлены в systemd:
systemctl list-units
Список unit-файлов можно получить командой:
systemctl list-unit-files
Данная команда отобразит все доступные юнит-файлы (не зависимо от того, были они загружены в systemd после загрузки ОС или нет).
Чтобы вывести список активных сервисов и их состояние, выполните:
# systemctl list-units -t service
Следующая команда выведет список юнитов, которые загрузил или пытался загрузить systemd. Так как после запуска некоторые юниты могут стать неактивными, с помощью флага —all вы получите полный список.
# systemctl list-units --all
UNIT LOAD ACTIVE SUB DESCRIPTION proc-sys-fs-binfmt_misc.automount loaded active waiting ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ● exim.service not-found inactive dead exim.service firewalld.service loaded active running firewalld - dynamic firewall daemon [email protected] loaded active running Getty on tty1 ● ip6tables.service not-found inactive dead ip6tables.service ● ipset.service not-found inactive dead ipset.service ● iptables.service not-found inactive dead iptables.service Bring up/down networking ● NetworkManager-wait-online. service not-found inactive dead
Как видим из списка, здесь отображаются даже сервисы, которые не были найдены на диске «not-found».
Использую данную команду, вы можете добавить и другие флаги, например:
- —state — используется для определения состояния демона Load, Active, Sub
- —type — позволяет фильтровать юниты по их типу.
Примеры:
systemctl list-units --all --state=active
— выведет список только активных юнитов
systemctl list-units —type=service
— выведет список юнитов, которые являются сервисом.
Добавление сервиса в systemd
Для управления сервисами в systemd используется особый синтаксис. После имени серверсв в конце нужно указывать .service. Например:
systemctl enable nginx.service
– команда добавит в автозагрузку веб-сервер nginx
Данная команда создаст символическую ссылку на копию файла, указанного в команде сервиса, в директории автозапуска systemd.
# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service
Вывод этой команды показывает в какой директории был создан симлинк на файл сервиса.
Чтобы посмотреть добавлен тот или иной сервис в автозагрузку, можно проверить его статус:
systemctl status nginx.service
При выводе нужно обратить внимание на строку:
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Значение enabled означает что данный сервис загружается автоматически (добавлен в автозагрузку). Если сервис не загружается автоматом, здесь буде указано disabled.
Удаление сервиса из systemd
Вы можете удалить сервис из автозагрузки, чтобы он не запускался после старта Linux (при этом сам сервис с сервера не удаляется). Чтобы удалить сервис из автозагрузки, выполните команду:
systemctl disable нужный_сервис
Например, чтобы удалить из автозагрузки nginx, выполните:
# systemctl disable nginx. service
Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service
После выполнения команды, симлинк на файл сервиса будет удален из директории systemd. Можно проверить, есть ли юнит в автозагрузке:
# systemctl is-enabled sshd
Systemd: маскировка юнитов
В моей практике встречались «вредные» сервисы, которые после удаления их из автозагрузки, все равно там оставались и запускались после рестарта ОС. Чтобы решить этот вопрос, можно замаскировать сервис:
systemctl mask nginx.service
И после этого, он вообще не будет запускаться, ни вручную, ни после перезагрузки ОС:
# systemctl mask nginx.service
Created symlink from /etc/systemd/system/nginx.service to /dev/null.
# service nginx restart
Redirecting to /bin/systemctl restart nginx.service Failed to restart nginx.service: Unit is masked.
Снять маску можно командой:
# systemctl unmask nginx. service
Removed symlink /etc/systemd/system/nginx.service.
Если после маскировки сервиса, вы проверите юнит-файлы, то увидите, что сервис помечен как замаскированный (состояние masked):
Таким нехитрым способом, можно избавить себя от удаления сервиса, даже если он не удаляется из автозагрузки systemd.
Автозапуска скриптов и сервисов с помощью rc.local
Для запуска различных скриптов при загрузке Linux чаще всего используется rc.local.
Но помимо скриптов, через rc.local так же можно и запускать сервисы, даже те, которые запускаются через systemd. Не могу ответить на вопрос, для чего использовать в таком случае rc.local, если есть systemd, но пару примеров я приведу.
Начнем с того, что файл /etc/rc.local должен быть исполняемым:
chmod +x /etc/rc.local
Rc.local должен быть добавлен в автозагрузку systemd:
systemctl enable rc-local
И на примере того же nginx, мы можем добавить в rc. local команду запуска веб-сервера:
service nginx start
Но я редко использую rc.local для запуска сервисов. Чаще rc.local используется, когда нужно запустить скрипт, либо выполнить разово какую-то команду.
К примеру, я создал скрипт /root/test.sh который выполняет некоторые действия, и хочу запустить его сразу после запуска системы. Добавляем в файл rc.local строку:
sh /root/test.sh
Начиная с CentOS 7, разработчики указывают на то, что rc.local устаревший демон и осуществлять автозапуск скриптов или сервисов через него, это прошлый век. Но пока он работает, я пользуюсь им, так как он очень прост в эксплуатации.
Создание собственного демона и добавление его в systemd
Вы можете создать собственный демон, которым можно будет управлять через systemd.
Например, нам нужно запускать все тот же скрипт /root/test. sh после перезагрузки системы. Начнем с создания файла нашей будущей службы:
touch /etc/systemd/system/test-script.service
chmod 664 /etc/systemd/system/test-script.service
nano /etc/systemd/system/test-script.service
Содержимое файла будет следующее:
[Unit] Description=Template Settings Service After=network.target [Service] Type=oneshot User=root ExecStart=/root/test.sh [Install] WantedBy=multi-user.target
Основные параметры:
User – пользователь под которым будет запускаться демон
Type=oneshot — процесс будет завершен до запуска дальнейших юнитов
Проверяем и перезапускаем:# systemctl daemon-reload
# systemctl start test-script.service
# systemctl status test-script.service
● test-script.service - Test Loaded: loaded (/etc/systemd/system/test-script.service; disabled; vendor preset: disabled) Active: active (running)
Если вас устроило то, как работает сервис, добавьте его в автозагрузку:
# systemctl enable test-script. service
Created symlink from /etc/systemd/system/multi-user.target.wants/test-script.service to /etc/systemd/system/test-script.service.
Таким образом, вы можете добавить любой ваш скрипт в автозагрузку через systemd.
Автозапуск через cron
Если вам с какой-то периодичностью нужно запускать скрипт или команду, вы можете воспользоваться cron-ом:
crontab -e
— открыть терминал для написания задания cron
И добавьте туда нужное вам задание, например:
* * * * * /root/test.sh
— запускать скрипт каждую минуту.
Можно написать скрипт watch-dog, который по заданию будет проверять, например, статус какого-либо сервиса и, если он не работает, запускать его. На нескольких своих проектах я использую подобную схему.
Чтобы вывести список всех заданий в крон, нужно выполнить команду:
# crontab -l
* * * * * /root/test.sh
Допустимые значения для времени запуска заданий cron по порядку:
- Минуты от 0 до 59
- Часы от 0 до 59
- День месяца от 1 до 31
- Месяц от 1 до 12
- День недели от 0 до 7 (0 или 7 это воскресение)
В нашем задании скрипт запускается каждую минуту, поэтому там стоят «*».
Так же вы можете разместить нужный вам скрипт в директориях cron:
- /cron.daily – выполнение скрипта ежедневно
- /cron.hourly – выполнение скрипта ежечасно
- /cron.monthly — выполнение скрипта ежемесячно
- /cron.weekly — выполнение скрипта еженедельно
Скрипты в указанных директория будут запускаться согласно автоматически подготовленного расписания.
.bashrc: автозапуск скриптов при запуске терминала
Если вам требуется выполнять какие-то действия при запуске терминала ssh, вы можете добавить любую команду или выполнение скрипта в .bash_profile или .bashrc. Теоретически, вы можете добавить какое-либо действие в любой из этих файлов, оно выполнится в любом случае. Обычно все необходимое добавляется в .bashrc, а сам .bashrc запускают из .bash_profile.
Я добавил в файл .bashrc команду на рестарт веб-сервиса nginx:
service nginx restart
После этого сохранил файл и перезапустил терминал:
Как видите, при запуске терминала, веб-сервер был перезапущен. Какие действия можно выполнять при запуске терминала? Вероятно, запускать какие-то вспомогательные утилиты, например, проверка uptime
сервера:
Или вы хотите, чтобы при запуске терминала, вы сразу попадали в нужную вам директорию и запускали mc, добавьте в .bashrc
cd /var/
mc
Надеюсь эта статья по управлению автозапуском сервисов и скриптов в LInux (статья писалась для CentOS) оказалась полезной для вас. Наверняка тем, кто только познает азы системного администрирования Linux, это информация будет кстати.
Управляем автозагрузкой в Linux — Сайт одного DevOpsa
Systemd — управление автозагрузкой служб в Linux
В большистве популярных современных популярных дистрибутивов Linux (CentOS, RHEL, Debian, Fedora и Ubuntu) в качестве демона автозагрузки вместо init.d используется systemd.
Systemd – менеджер системы и служб Linux, используется для запуска других демонов и управления ими в процессе работы, использует unit-файлы из /etc/systemd/system (init. d использовал скрипты из каталога /etc/init.d/). Systemd позволяет распараллелить запуск служб в процессе загрузки ОС, тем самым ускоряя запуск.
Для управления system используется команда systemctl.
Для начала, после загрузки системы, мы проверим список юнитов, которые в данный момент добавлены в systemd:
systemctl list-units
Список unit-файлов можно получить командой:
systemctl list-unit-files
Данная команда отобразит все доступные юнит-файлы (не зависимо от того, были они загружены в systemd после загрузки ОС или нет).
Чтобы вывести список активных сервисов и их состояние, выполните:
systemctl list-units -t service
Следующая команда выведет список юнитов, которые загрузил или пытался загрузить systemd. Так как после запуска некоторые юниты могут стать неактивными, с помощью флага — all вы получите полный список.
systemctl list-units --all
Добавление сервиса в systemd
Для управления сервисами в systemd используется особый синтаксис. После имени серверсв в конце нужно указывать .service. Например:
systemctl enable nginx.service
команда добавит в автозагрузку веб-сервер nginx
Данная команда создаст символическую ссылку на копию файла, указанного в команде сервиса, в директории автозапуска systemd.
systemctl enable nginx.service
Вывод этой команды показывает в какой директории был создан симлинк на файл сервиса.
Чтобы посмотреть добавлен тот или иной сервис в автозагрузку, можно проверить его статус:
systemctl status nginx.service
При выводе нужно обратить внимание на строку:
Loaded: loaded (/usr/lib/systemd/system/nginx. service; enabled; vendor preset: disabled)
Значение enabled означает что данный сервис загружается автоматически (добавлен в автозагрузку). Если сервис не загружается автоматом, здесь буде указано disabled.
Удаление сервиса из systemd
Вы можете удалить сервис из автозагрузки, чтобы он не запускался после старта Linux (при этом сам сервис с сервера не удаляется). Чтобы удалить сервис из автозагрузки, выполните команду (* — нужный сервис):
systemctl disable *.service
Например, чтобы удалить из автозагрузки nginx, выполните:
systemctl disable nginx.service
Removed symlink /etc/systemd/system/multi-user.target.wants/nginx.service
После выполнения команды, симлинк на файл сервиса будет удален из директории systemd. Можно проверить, есть ли юнит в автозагрузке:
systemctl is-enabled sshd
Systemd — маскировка юнитов
Иногда встречаются ненужные сервисы, которые после удаления их из автозагрузки, все равно там оставались и запускаются после перезагрузки. Чтобы решить этот вопрос, можно замаскировать сервис:
systemctl mask nginx.service
И после этого он вообще не будет запускаться:
systemctl mask nginx.service
Created symlink from /etc/systemd/system/nginx.service to /dev/null.
service nginx restart
Redirecting to /bin/systemctl restart nginx.service
Failed to restart nginx.service: Unit is masked.
Снять маску можно командой:
systemctl unmask nginx.service
Removed symlink /etc/systemd/system/nginx.service.
Если после маскировки сервиса, вы проверите юнит-файлы, то увидите, что сервис помечен как замаскированный (состояние masked).
Таким нехитрым способом, можно избавить себя от удаления сервиса, даже если он не удаляется из автозагрузки systemd.
Собственный демон и добавление его в systemd
Можно создать собственный демон, которым будем управлять через systemd.
Например, нам нужно запускать все тот же скрипт /root/script.sh после перезагрузки системы. Начнем с создания файла нашей будущей службы:
touch /etc/systemd/system/script.service
chmod 664 /etc/systemd/system/script.service
nano /etc/systemd/system/script.service
Содержимое файла будет следующее:
[Unit]
Description=Template Settings Service
After=network.target
[Service]
Type=oneshot
User=root
ExecStart=/root/script.sh
[Install]
WantedBy=multi-user.target
Основные параметры:
User — пользователь под которым будет запускаться демон
Type=oneshot — процесс будет завершен до запуска дальнейших юнитов
Проверяем и перезапускаем:
systemctl daemon-reload
systemctl start test-script.service
systemctl status test-script.service
Output
● script.service - Test
Loaded: loaded (/etc/systemd/system/script. service; disabled; vendor preset: disabled)
Active: active (running)
Если все хорошо, добавляем его в автозагрузку:
systemctl enable script.service
Created symlink from /etc/systemd/system/multi-user.target.wants/script.service to /etc/systemd/system/script.service.
Таким образом, мы можем добавить любой скрипт в автозагрузку через systemd.
Автозапуск в Linux
Linux- Recluse
- 22.10.2019
- 7 541
- 0
- 17
- 17
- 0
- Содержание статьи
Systemd
На современных дистрибютивах Linux (а так же других UNIX-подобных операционных системах), одним из самых простых способов запуска нужной команды, скрипта или программы является создание сервиса для Systemd.
Рассмотрим решение задачи автозапуска скрипта hello.sh лежащего по адресу /home/sysadmin/:
- Сперва создадим файл по адресу
/lib/systemd/system/
, и назовем его hello.service. - Заполняем свежесозданный файл:
[Unit] Description=Hello script After=multi-user.target [Service] Type=idle ExecStart=/home/sysadmin/hello.sh [Install] WantedBy=multi-user.target
В первой строчке секции Unit можно написать краткое описание исполняемого файла, вторая отвечает за возможность запуска данного скрипта в многопользовательском режиме.
В секции Service, Type отвечает за однократный запуск (при значении idle), а ExecStart — это путь к исполняемому файлу. - Для включения автозапуска осталось выполнить несколько команд:
- Даем права на чтение всем пользователям:
sudo chmod 644 /lib/systemd/system/hello.service
- Обновляем список доступных сервисов systemd:
sudo systemctl daemon-reload
- Включаем автозагрузку сервиса hello:
sudo systemctl enable hello.service
- Даем права на чтение всем пользователям:
rc.local
Одним из самых старых способов запуска нужных команд является специальный файл rc.local. Находится данный файл в директории /etc/ и по умолчанию содержит всего одну команду:
exit 0
Достаточно написать что-то перед данной строкой, и эта команда будет исполнятся при запуске системы.
В современных системах, вроде Debian 9 или Ubuntu 18.04, данный файл отсутствует, но ради обеспечения обратной совместимости возможность автозапуска с его помощью оставлена.
Для его использования его необходимо создать, а затем дополнительно активировать через systemd:
systemctl enable rc-local
systemctl start rc-local.service
.bashrc и .profile
Если нужно автоматически запускать какую-то программу, скрипт или команду при входе пользователя в систему, то для этой цели прекрасно подойдут файлы .bashrc и .profile, которые должны лежать в домашней директории пользователя. Достаточно вписать туда любую команду, и она будет выполняться при каждом логине пользователя.
Если существует файл .bashrc, то файл .profile выполняться не будет!
Как добавить любую программу в автозагрузку Linux
У каждого пользователя есть набор программ, которые он запускает ежедневно. Чтобы избавить себя от необходимости проделывать это вручную, оные приложения можно добавить в автозагрузку. В Windows это можно сделать, закинув ярлык программы в каталог автозагрузки, прописав ее в соответствующем ключе реестра или добавив в Планировщик заданий. А как с этим дела обстоят в Linux? В операционной системе Linux также имеется автозагрузка, но работает она несколько иначе.
За автозагрузку в Linux отвечает специальный процесс, именуемый системой инициализации. Этот процесс запускает все остальные процессы после того, как ядро операционной системы передаст ему дальнейшее управление. Также в Linux имеется несколько уровней или режимов автозагрузки. Например, автозагрузка на уровне ядра позволяет заменить систему инициализации любой другой программой. Есть уровни автозагрузки специально для скриптов (rc.local и Xinitrc), есть автозагрузка bash, позволяющая автоматически выполнять команды в открытом терминале и есть автозагрузка окружения рабочего стола.
Этот последний уровень для начинающих осваивать Linux пользователей является наиболее удобным. Добавим для примера в автозагрузки Ubuntu браузер Firefox.
Откройте поиск и начинайте вводить «автоматически запускаемые приложения», а когда в списке приложений появится одноименная утилита, запустите ее.
Нажмите кнопку «Добавить».
И укажите в открывшемся окошке название добавляемого в автозагрузку приложения и путь к его исполняемому файлу.
Исполняемые файлы пользовательских приложений в Linux копируются в папку /usr/bin, а если программа запускается с правами администратора, то в папку /usr/sbin. Если вы не нашли в них своей программы, поищите ее в папке /usr/opt, иногда разработчики прописывают в программе этот путь установки.
Поле «Описание» заполнять необязательно.
Всё, жмем «Добавить» и программа окажется в автозагрузке.
Второй способ добавить программу в автозагрузку — создать в папке ~/.config/autostart конфигурационный файл desktop. Вот как, к примеру, выглядит содержимое файла автозапуска только что добавленной нами в автозагрузку Firefox.
Папка «.config» располагается в каталоге Home и является скрытой, чтобы ее показать, нажмите Ctrl + H. В папке autostart создайте пустой документ.
Откройте его текстовым редактором и вставьте в него набор команд, указанный на скриншоте.
Это минимальный набор параметров.
В нашем примере в автозагрузку добавляется текстовый редактор leafpad, его название мы указываем в параметрах Name и Exec. Осталось только переименовать файл в name.desktop, где name — название программы.
По сути, данный способ равнозначен первому способу, но при этом вы не используете утилиту настройки запуска приложений. Кстати, если вы откроете эту утилиту, то найдете в списке добавленную посредством ручного создания конфигурационного файла программу.
Как видите, добавлять программы в автозагрузку Linux не так уже и трудно.
Конечно, есть здесь и свои нюансы, Linux вообще очень гибкая система, но для начала этих знаний вам будет вполне достаточно, чтобы автоматически запускать любые пользовательские приложения.
как убрать и добавить программу в автозапуск
В Убунту есть 2 основных уровня автозапуска — в системе инициализации systemd и в рабочем окружении. Для пользовательского софта автозагрузка в Ubuntu может быть настроена в удобной графической утилите. Добавить в автозапуск можно программу или собственный скрипт.
Автозагрузка в Ubuntu
Актуальная Ubuntu 18.04 по умолчанию в качестве рабочего окружения использует GnomeShell. Для настройки автозапуска в этой версии ОС нужно:
- Нажать на кнопку «Обзор» в левом верхнем углу экрана.
- Начать вводить в строку поиска «Автоматически запускаемые приложения» и запустить найденную утилиту.
- Далее кликнуть по кнопке «Добавить», чтобы внести желаемое приложение в автозагрузку.
- Заполнить поля «Имя» (название программы — как удобно) и «Команда» (та, которую вводят в консоли для запуска этого софта). Поле «описание» необязательное, сюда разрешено вписать любой комментарий.
Пример добавления Transmission в автозагрузку в Линукс показан на скриншоте: - Нажать кнопку «Добавить».
Совет! Чтобы не ошибиться с правильностью команды, нужно установить утилиту «Главное меню» из UbuntuSoftwareCenter.
В ней выбрать интересующий пункт и открыть его свойства. Правильная команда копируется из одноименной строки.
Запуск приложений в Ubuntu, присутствующих в списке и помеченных галочкой, будет происходить при каждом старте ОС. Все это приложения данного пользователя, системные программы и сервисы, утилита не отображает. В предыдущих версиях операционной системы с графической оболочкой Unity утилита для настройки автозагрузки также ищется поиском по меню Dash или открывается с помощью команды в терминале:
gnome-session-properties.
Как добавить скрипт в автозагрузку Ubuntu
Кроме конкретного софта, добавить в автозагрузку Linux легко и самописный скрипт, чтобы оптимизировать работу за компьютером. Для этого необходимо:
- Сделать скрипт исполняемым с помощью команды:
sudochmodugo+x /home/user/script.sh
(где user — имя пользователя, а script — название скрипта, но путь до вашего файла .sh может отличаться: его нужно прописать полностью, иначе скрипт не запустится).
- Открыть «Автоматически запускаемые приложения» и нажать «Добавить».
- Ввести имя скрипта, а в качестве команды — полное название с путем до файла, например, /home/user/script.sh.
- Кликнуть по «Добавить».
Есть другой, классический, но считающийся устаревшим способ настроить автозапуск скрипта в Ubuntu. Для его выполнения нужно:
- Открыть терминал и выполнить команду:
sudonano /etc/rc.local
- Над строкой exit 0 прописать название и путь до скрипта.
- Сохранить изменение с помощью сочетания клавиш Ctrl+O, подтвердить клавишей Enter.
Этот способ подойдет и для автозагрузки на UbuntuServer, где нет графики.
Отсрочка автозапуска программ в Ubuntu
Если программ в автозагрузке Убунту очень много, их необходимо подгружать в определенном порядке или запускать спустя какое-то время после загрузки системы — поможет функция отсрочки. Для ее активации используется unix-утилита sleep. Воспользоваться возможностями этого инструмента можно в уже знакомой программе «Автоматически запускаемые приложения». Для этого нужно:
- Открыть окно параметров запускаемых приложений.
- Выделить курсором программу, автозапуск которой необходимо отсрочить, и воспользоваться кнопкой «Изменить».
- В строке «Команда» перед имеющеюся записью внести:
sleep 120,
где цифра после слова «спать» равна количеству секунд, которое приложение бездействует сразу после старта системы, перед тем как запуститься. Между данной формулой, в конце которой обязательна точка с запятой, и командой на запуск приложения, должен быть пробел.
В приведенном примере отложенной автозагрузки программ в Ubuntu приложение остается в состоянии «сна» 2 минуты, прежде чем открыться. Например, запуск через полчаса после старта ОС будет выглядеть как sleep 3h «имя программы». Пример, в котором Transmission запускается через 1 час:
sleep 1h; transmission-gtk %U
Аналогичным образом можно добавить в автозагрузку в Linux отсроченное выполнение пользовательского скрипта или запуск медиафайла.
Удаление из автозапуска Ubuntu
Чтобы убрать софт из автозагрузки Ubuntu, можно воспользоваться одним из 2 способов: через «Автоматически запускаемые приложения» или вручную. В первом случае достаточно запустить утилиту, выделить нужную программу и нажать «Удалить». Простое снятие галочки отключается программа, и она не будет запускаться при старте системы.
Ручной способ подразумевает использование папки autostart в Ubuntu. Она расположена по адресу /home/имя пользователя/.config/autostart/ (чтобы увидеть эту скрытую папку, следует открыть домашний каталог в файловом менеджере и нажать одновременно клавиши Ctrl+H). В ней лежат файлы с расширением .desktop для каждой программы из автозапуска, формирующиеся автоматически при добавлении через графическую утилиту. Достаточно удалить файл, чтобы программа больше не открывалась при включении компьютера.
Заключение
Автозагрузка в Ubuntu имеет множество способов тонкой настройки. Ее возможности трудно охватить. Грамотное использование этого инструмента делает ОС Linux практичнее в повседневных задачах.
Автозапуск пользовательских скриптов при инициализации системы – oss-it
Иногда пользователи могут столкнуться с необходимостью добавления каких-то сервисов или событий в автозагрузку Linux системы (Ubuntu, Debian, CentOS, Gentoo, Alpine Linux и так далее), но не всегда удается сделать это встроенным в графическую среду средствами (например Startup Applications в Ubuntu). То, как сделать простой скрипт и добавить его запуск при инициализации системы будет рассказано ниже.
Опишем это на простом примере: opendchub – это сервис dc-хаба, который может запускаться только под супер-пользователем (то есть он запускается вручную только командой sudo opendchub
или непосредственно под root’ом).
Для начала создадим скрипт запуска в стандартном каталоге инициализации системы:
sudo nano /etc/init.d/odchub
В текстовом редакторе введите три строки будущего скрипта:
#!/bin/bash
echo "Opendchub starting..."
opendchub
Сохраните изменения (Ctrl+O) и выйдите из текстового редактора nano (Ctrl+X)
В первой строке этого скрипта указывается интерпретатор (если вы не знакомы с этим понятием, то лучше оставить именно такой как указан выше).
Во второй строке, командой echo обеспечивается простой вывод на экран текста – в принципе эта строка необязательна, она лишь будет информировать пользователя о том, какое действие происходит в данный момент.
Третьей строкой собственно указывается команда запуска (в нашем примере – это сервис opendchub) – пишется тут всё точно также, как вы выполняли необходимую команду в терминале, за исключением того, что не надо добавлять ‘sudo‘ – так как этот скрипт будет выполняться при инициализации системы, то есть уже сразу под суперпользователем.
После того как файл создан, сделаем его исполняемым:
sudo chmod +x /etc/init.d/odchub
Теперь добавим созданный скрипт к автозагрузке. Для этого есть несколько способов, опишем два наиболее встречающихся.
Если вывод команды:
ps -p 1 -o comm=
в вашем дистрибутиве покажет “systemd”, то рекомендуем создать systemd unit, в других случаях стоит прибегнуть ко второму описаному решению, init.
Systemd и init – это разные системы инициализации, используемые в Linux. Изначально массово использовалась init, но последние годы во всё большем количестве дистрибутивов используется systemd. Стоить добавить, что это не единственные системы инициализации, но как правило большинство из них поддерживают синтаксис init.
Systemd
Перед тем как добавить наш сценарий в автозагрузку при использовании системы инициализации systemd, потребуется создать соответствующий файл описания (так называемый “юнит”, являющийся прямой инструкцией системной службы):
sudo nano /etc/systemd/system/odchub.service
В текстовом редакторе скопируйте следующие строки в этот файл:
[Unit]
Description=Opendchub service
After=network.target
[Service]
ExecStart=/etc/init.d/odchub
[Install]
WantedBy=multi-user.target
Сохраните изменения (Ctrl+O) и выйдите из текстового редактора nano (Ctrl+X).
Description – заполняентся произвольно, это просто описание юнита.
After=network.target – означает, что эта служба сможет быть запущена только после поднятия сетвых сервисов.
ExecStart – путь к исполняемому файлу, будет выполнять при старте службы.
WantedBy=multi-user.target – означает, что будущий сервис будет запускаться после активации цели multi-user.target (примерно тоже самое что runlevel 3 в init).
Более подробно о возможностях systemd можно прочесть здесь или здесь.
После сохранения файла юнита вы можете использовать созданную службу odchub, например, стартовать (единократно выполнить написанный нами скрипт):
sudo systemctl start odchub
А этой командой вы “включите”, то есть добавите в автозагрузку системы:
sudo systemctl enable odchub
Для удаления созданной таким образом службы, достаточно пары команд:
sudo systemctl disable odchub
sudo rm /etc/systemd/system/odchub.service
Init
После того как создан исполняемый скрипт в соответствующей директории (в нашем случае /etc/init.d/odchub), для включения его при загрузках системы, достаточно выполнить команду:
sudo update-rc.d odchub defaults 90
Числовое значение после слова defaults указывает на приоритет для старта этого скрипта.
В результате этих действий сервис opendchub будет запускаться еще до загрузки графической среды, сразу вместе с инициализацией операционной системой. Если вы захотите удалить этот скрипт из автозагрузки, то перед тем как удалить сам файл надо выполнить такую команду:
sudo update-rc.d -f odchub remove
Используя эти простые примеры вы можете аналогичным образом создать свой собственный скрипт и добавить его к автозагрузке.
Что делает автозагрузка в zsh?
автозагрузка
указывает zsh искать файл в $ FPATH
/ $ fpath
, содержащий определение функции, вместо файла в $ PATH
/ $ path
, содержащего скрипт (или двоичный исполняемый файл).
Сценарий — это просто последовательность команд, которые выполняются при запуске сценария. Например, предположим, что у вас есть файл с именем hello
:
echo «Настройка приветствия»
приветствие = 'Привет'
Сценарии получают свою собственную копию процесса оболочки, поэтому все, что они делают, не может иметь побочных эффектов для вызывающей среды оболочки.Назначение приветствию
выше будет действовать только в пределах сценария; как только он выйдет, он не повлияет на ваш интерактивный сеанс оболочки:
$ привет
Настройка приветствия
$ echo $ приветствие
$
Функции определяются один раз и хранятся в памяти оболочки; когда вы их вызываете, они выполняются внутри среды вашей оболочки и поэтому могут иметь побочные эффекты:
привет () {
echo "Настройка 'приветствия'"
приветствие = 'Привет'
}
$ привет
Настройка приветствия
$ echo $ приветствие
Привет
Итак, вы используете функции, когда хотите изменить среду оболочки.Редактор строк Zsh (ZLE) также использует функции — когда вы привязываете клавишу к какому-либо действию, это действие определяется как функция оболочки (которая должна быть добавлена в ZLE с помощью команды zle -N
).
Теперь, если у вас много функций, то вы, возможно, не захотите определять их все в вашем .zshrc
каждый раз, когда вы запускаете новую оболочку; это замедляет запуск оболочки и использует память для хранения функций, которые вы, возможно, не вызовете в течение срока службы этой оболочки. Таким образом, вы можете вместо этого поместить определения функций в их собственные файлы, названные в честь функций, которые они определяют, и поместить файлы в каталоги в вашем $ FPATH
, который работает как $ PATH
.Zsh поставляется с набором стандартных функций по умолчанию $ FPATH
. Но он не будет знать, что нужно искать там команду, если вы сначала не сказали ему, что команда является функцией. По сути, это то, что делает autoload
; он говорит: «Привет, Zsh, это имя команды здесь — функция, поэтому, когда я пытаюсь запустить ее, ищите ее определение в моем FPATH вместо того, чтобы искать команду в моем PATH».
Следует отметить, что при первом запуске функции autoload
ed, Zsh является источником файла определения, но — в отличие от ksh — не вызывает затем функцию .Вы должны вызвать функцию внутри файла после его определения, чтобы первый вызов работал. автозагрузка
способное определение hello
может выглядеть так:
привет () {
echo "Настройка 'приветствия'"
приветствие = 'Привет'
}
привет "$ @"
php — Composer & Linux production server — автозагрузка не работает
Смотрим путь в ошибках /app/Middleware/AuthMiddleware.php
Похоже, проблема вызвана конфликтом пространства имен App \\
, указывающим на / app
в вашей производственной среде, в отличие от вашего объявления PSR-4, указывающего на / App
.
Чтобы избежать конфликтов и сопоставить все пространства имен указанного каталога, вы можете использовать параметры autoload classmap
или config optimize-autoloader
(необязательно) в composer.json
, чтобы определить физический путь ко всем файлам и объекты в указанных каталогах для загрузки композитором. Кроме того, с объявлением PSR-4 любые файлы, не найденные в путях карты классов, будут пытаться загрузить из деклараций путей пространства имен App
.Например, при использовании опции exclude-from-classmap
.
"config": {
"optimize-autoloader": правда
},
"автозагрузка": {
"пср-4": {
"Приложение \\": "Приложение /"
},
"карта классов": [
"Приложение/",
],
}
После внесения изменений в composer.json
, обязательно запустите php composer.phar update --lock
в своей среде разработки.
Затем после загрузки composer.lock
и composer.json
в производственную среду, запустите php composer.phar install --no-dev -o
или php composer.phar dump-autoload --no-dev -o
из производственной среды.
Параметр -o
приведет к принудительному запуску сопоставления классов optimize-autoloader
, а --no-dev
предотвратит установку пакетов разработки ( require-dev
). Использование optimize-autoloader
рекомендуется для производственных сред.
Как правило, каждый раз, когда вы развертываете изменения разработки в производственной среде, вам необходимо запустить php composer.phar install --no-dev -o
См. Как правильно выполнить развертывание при использовании переключателя разработка / производство Composer ?. Таким образом, изменения, внесенные из вашей среды разработки с использованием php composer.phar update
, будут правильно установлены в вашей производственной среде.
— systemd: автоматизировать команду modprobe во время загрузки
В любом дистрибутиве, использующем systemd
, вы можете автоматически загрузить модуль через modules-load.д
:
создать файл конфигурации:
/etc/modules-load.d/rt2800usb.conf
откройте его и отредактируйте следующим образом (добавьте имя модуля):
RT2800USB
при следующей перезагрузке модуль должен загрузиться автоматически
Устранение неисправностей:
Проверить, загрузила ли служба systemd
модуль:
статус systemctl systemd-modules-load.услуга
Результат должен выглядеть так:
systemd-modules-load.service - Загрузка модулей ядра
Загружено: загружено (/usr/lib/systemd/system/systemd-modules-load.service; статический)
Активен: активен (покинул) с среды, 3 апреля 2013 г., 22:50:57 +0000; 46с назад
Документы: man: systemd-modules-load.service (8)
человек: модули-load.d (5)
Процесс: 260 ExecStart = / usr / lib / systemd / systemd-modules-load (код = завершен, статус = 0 / УСПЕХ)
Последняя строка содержит PID
(идентификатор процесса) и код выхода. status = 0 / SUCCESS
означает, что модуль был успешно вставлен, подтвержден:
journalctl -b _PID = 260
Выход:
3 апреля, 22:50:57 mxhst systemd-modules-load [260]: вставлен модуль 'rt2800usb'
В случае сбоя вывод systemctl
выглядит так:
systemd-modules-load.service - Загрузка модулей ядра
Загружено: загружено (/usr/lib/systemd/system/systemd-modules-load.service; статический)
Активно: не удалось (результат: код выхода) с среды, 3 апреля 2013 г., 22:50:59 +0000; 43с назад
Документы: man: systemd-modules-load.сервис (8)
человек: модули-load.d (5)
Процесс: 260 ExecStart = / usr / lib / systemd / systemd-modules-load (код = завершен, статус = 1 / ОТКАЗ)
с отчетом journalctl -b
:
3 апреля, 22:50:59 mxhst systemd-modules-load [260]: не удалось найти модуль 'fakert2800usb'
Если код выхода 0 / УСПЕХ
, это означает, что ваш модуль был успешно вставлен; работает
lsmod | grep rt2800
должен подтвердить, что:
rt2800usb 26854 0
rt2x00usb 19757 1 rt2800usb
rt2800lib 64762 1 rt2800usb
rt2x00lib 66520 3 rt2x00usb, rt2800lib, rt2800usb
mac80211 578735 3 rt2x00lib, rt2x00usb, rt2800lib
Если вывод lsmod
не подтверждается (несмотря на то, что код выхода службы — 0 / SUCCESS
), это означает, что модуль был удален после загрузки с помощью modules-load.сервис
. Одна из возможных причин — это другой файл * .conf
, который поместил модуль в черный список. Найдите строку вроде:
черный список rt2800usb
в /etc/modprobe.d/*.conf
, /usr/lib/modprobe.d/*.conf
или /run/modprobe.d/*.conf
и закомментируйте / удалите его.
Как определить и загрузить свою собственную функцию оболочки в zsh
В zsh путь поиска функций ($ fpath) определяет набор каталогов, содержащих файлы, которые можно пометить для автоматической загрузки, когда функция, которую они содержат, понадобится в первый раз.
Zsh имеет два режима автозагрузки файлов: собственный способ Zsh и другой режим, напоминающий автозагрузку ksh. Последний активен, если установлена опция KSH_AUTOLOAD. По умолчанию используется собственный режим Zsh, и я не буду здесь обсуждать другой способ (подробности об автозагрузке в стиле ksh см. В «man zshmisc» и «man zshoptions»).
Хорошо. Допустим, у вас есть каталог `~ / .zfunc ‘и вы хотите, чтобы он был частью пути поиска функции, вы делаете это:
fpath = (~ / .zfunc "$ {fpath [@]}")
Это добавляет ваш личный каталог к перед пути поиска.Это важно, если вы хотите заменить функции из установки zsh своими собственными (например, если вы хотите использовать обновленную функцию завершения, такую как `_git ‘из репозитория CVS zsh, с более старой установленной версией оболочки).
Также стоит отметить, что каталоги из `$ fpath ‘не ищутся рекурсивно. Если вы хотите, чтобы в вашем личном каталоге выполнялся рекурсивный поиск, вам придется позаботиться об этом самостоятельно, например (следующий фрагмент требует установки параметра EXTENDED_GLOB):
fpath = (
~ /.zfuncs
~ / .zfuncs / ** / * ~ * / (CVS) # (/ N)
"$ {fpath [@]}"
)
Это может показаться непонятным для неподготовленного глаза, но на самом деле он просто добавляет все каталоги ниже `~ / .zfunc ‘в` $ fpath’, игнорируя каталоги с именем «CVS» (что полезно, если вы планируете проверить все дерево функций из CVS zsh в ваш личный путь поиска).
Предположим, у вас есть файл `~ / .zfunc / hello ‘, содержащий следующую строку:
printf 'Привет, мир. \ N'
Все, что вам нужно сделать сейчас, это отметить функцию, которая будет автоматически загружаться при первой ссылке:
автозагрузка -Uz привет
«Что это за -Uz?», Спросите вы? Что ж, это всего лишь набор параметров, которые заставят `autoload ‘действовать правильно, независимо от того, какие параметры были установлены в противном случае.U отключает расширение псевдонима во время загрузки функции, а z вызывает автозагрузку в стиле zsh, даже если по какой-либо причине установлено значение KSH_AUTOLOAD.
После того, как об этом позаботятся, вы можете использовать новую функцию `hello ‘:
zsh% привет Привет мир.
Несколько слов о поиске этих файлов: это просто неверно . Если бы вы отправили этот файл `~ / .zfunc / hello ‘, он просто напечатал бы« Hello world ». однажды. Ничего больше. Никакая функция не будет определена. Кроме того, идея состоит в том, чтобы загружать код функции только тогда, когда требуется .После вызова `autoload ‘определение функции будет считано , а не . Функция просто помечена для автозагрузки позже по мере необходимости.
И, наконец, примечание о $ FPATH и $ fpath: Zsh поддерживает их как связанные параметры. Параметр нижнего регистра — это массив. Версия в верхнем регистре — это строковый скаляр, который содержит записи из связанного массива, соединенные двоеточиями между записями. Это сделано, потому что обработка списка скаляров более естественна с использованием массивов, а также при сохранении обратной совместимости для кода, который использует скалярный параметр.Если вы решите использовать $ FPATH (скалярный), будьте осторожны:
FPATH = ~ / .zfunc: $ FPATH
будет работать, а следующее — нет:
FPATH = "~ / .zfunc: $ FPATH"
Причина в том, что расширение тильды не выполняется в двойных кавычках. Вероятно, это источник ваших проблем. Если echo $ FPATH
печатает тильду, а не расширенный путь, это не сработает. На всякий случай я бы использовал $ HOME вместо тильды вроде этого:
FPATH = "$ HOME /.zfunc: $ FPATH "
При этом я бы предпочел использовать параметр массива, как я сделал это в начале этого объяснения.
Также не следует экспортировать параметр $ FPATH. Он нужен только текущему процессу оболочки, а не его дочерним элементам.
Обновление
Что касается содержимого файлов в `$ fpath ‘:
При автозагрузке в стиле zsh содержимое файла является телом определяемой им функции. Таким образом, файл с именем «hello» содержит строку echo «Hello world."
полностью определяет функцию» hello «. Вы можете указать hello () {...}
вокруг кода, но это было бы излишним.
Однако утверждение, что один файл может содержать только одну функцию, не совсем корректно.
Особенно если вы посмотрите на некоторые функции из системы завершения на основе функций (compsys), вы быстро поймете, что это заблуждение. Вы можете определять дополнительные функции в файле функций. Вы также можете выполнить любую инициализацию, которая может потребоваться при первом вызове функции.Однако, когда вы это сделаете, вы всегда будете определять функцию, которая называется как файл в файле, и вызывает эту функцию в конце файла, поэтому она запускается при первом обращении к функции.
Если — с подфункциями — вы не определили функцию с именем, подобным файлу внутри файла, вы получите в итоге эту функцию, имеющую определения функций (а именно, те из подфункций в файле). Фактически вы будете определять все свои подфункции каждый раз, когда вызываете функцию, названную как файл.Обычно это , а не , что вы хотите, поэтому вы должны переопределить функцию с именем, аналогичным файлу внутри файла.
Я добавлю короткий скелет, который даст вам представление о том, как это работает:
# Давайте снова предположим, что это содержимое файла с именем "hello".
# Здесь вы можете запустить произвольный код, который запустится при первом запуске
# указана функция. Обычно это код инициализации. Например
# функция завершения `_tmux 'делает именно это.эхо инициализация ...
# Здесь вы также можете определить дополнительные функции. Обратите внимание, что эти
# функции видны в глобальной области видимости, поэтому крайне важно использовать
# будьте осторожны, когда вы называете их, чтобы не затенять существующие команды или
# переопределить существующие функции.
hello_helper_one () {
printf 'Привет'
}
hello_helper_two () {
printf 'мир'.
}
# Теперь вы должны переопределить функцию "hello" (которая в настоящее время содержит
# весь код из файла) на что-то, что покрывает его фактическую
# функциональность.После этого две вспомогательные функции вместе с ядром
# функция будет определена и видна в глобальной области видимости.
Привет () {
printf '% s% s \ n' "$ (hello_helper_one)" "$ (hello_helper_two)"
}
# Наконец, запустите переопределенную функцию с теми же аргументами, что и текущая
# запустить. Если это не указано, функциональность, реализованная новым
# определенная функция "hello" не выполняется при первом вызове. Так:
привет "$ @"
Если вы запустите этот глупый пример, первый запуск будет выглядеть так:
zsh% привет инициализация... Привет мир.
И последовательные звонки будут выглядеть так:
zsh% привет Привет мир.
Надеюсь, это проясняет ситуацию.
(Одним из наиболее сложных примеров из реальной жизни, в котором используются все эти приемы, является уже упомянутая функция `_tmux ‘из системы завершения zsh, основанной на функциях.)
функций, автозагрузка — отображение или изменение функций KornShell
функции [ -tux ] [ название ] [название ]…
автозагрузка имя …
Функции позволяет изменять атрибуты функции, указанные в списке из имен в командной строке. Это встроенный псевдоним sh , определяемый с помощью
псевдоним functions = 'typeset -f'
Если не указаны имена функций , функции отображает все определенные в настоящее время функции с атрибутами, указанными варианты.Если параметры не указаны, функции перечисляет все текущие определенные функции.
автозагрузка сообщает оболочке, что указанные функции не определены. Это встроенный псевдоним sh , определяемый с помощью
псевдоним autoload = 'typeset -fu'
и, таким образом, эквивалентны функциям -u
Когда вы пытаетесь выполнить неопределенную функцию с именем funcname , каталоги, указанные в переменной среды FPATH ищутся каталог за каталогом для сценария с именем имя функции .ksh или, если он не найден, сценарий с именем funcname . Если такой сценарий найден, он выполняется в текущем оболочка. После выполнения этого сценария функция имя функции , определение которой должно было быть включено в исполняемом скрипте, теперь выполняется. Если функция имя-функции все еще не определено, возникает ошибка.
Опции
- -т
включает опцию xtrace для данных функций.См. Набор и gset .
- -u
позволяет вам указывать атрибуты для функций, которые еще не определены.
- -х
отмечает функцию для автоматического экспорта. См. экспорт .
- FPATH
содержит список каталогов, разделенных точкой с запятой, для поиска определения функций при выполнении неопределенной функции.
Кроме того, если эта переменная определена и ПУТЬ поиск не может найти команду с именем cmdname , каталоги, указанные в этой переменной, ищутся в каталогах по каталогу для пространства с именем cmdname .ksh или, если он не найден, сценарий с именем cmdname . Если такой сценарий найден, он выполняется в текущем оболочка. После выполнения этого сценария функция cmdname , определение которого должно было быть включено в исполняемом скрипте, теперь выполняется.Если функция cmdname все еще не определено, возникает ошибка.
Возможные значения статуса выхода:
- 0
Успешное завершение.
- > 0
Количество недопустимых name s, указанных в командной строке.
Windows Server 2012.Windows 8.1. Windows Server 2012 R2. Windows 10. Windows Server 2016. Windows Server 2019.
В системах UNIX функции встроено в KornShell. но не Bourne Shell.
Это псевдоним, встроенный в MKS KornShell.
Набор инструментов PTC MKS для опытных пользователей
PTC MKS Toolkit для системных администраторов
Набор инструментов PTC MKS для разработчиков
PTC MKS Toolkit для взаимодействия
Набор инструментов PTC MKS для профессиональных разработчиков
Набор инструментов PTC MKS для профессиональных разработчиков, 64-разрядная версия
PTC MKS Toolkit для корпоративных разработчиков
PTC MKS Toolkit для корпоративных разработчиков, 64-разрядная версия
Требования и валидация PTC Windchill
- Команды:
- экспорт , gset , набор , sh , наборный
Набор инструментов PTC MKS 10.3 Сборка документации 39.
Автозагрузка / изучение Vimscript на сложном уровне
Мы написали изрядное количество функций для нашего плагина Potion, и это все, что мы собираемся делать в этой книге. Прежде чем мы закончим, поговорим о нескольких более важные способы отполировать его и сделать его сияющим.
Первым в списке стоит сделать наш плагин более эффективным с автозагрузкой.
Как работает автозагрузка
В настоящее время, когда пользователь загружает наш плагин (открывая файл Potion), все его функционал загружен.Наш плагин все еще маленький, поэтому, вероятно, он не большой сделка, но для более крупных плагинов загрузка всего их кода может занять заметное количество времени.
Vim предлагает решение этой проблемы под названием «автозагрузка». Автозагрузка позволяет отложить загрузка кода до тех пор, пока он действительно не понадобится. Вы получите небольшое снижение производительности в целом, но если ваши пользователи не всегда используют каждый бит кода в вашем Автозагрузка плагинов может значительно ускорить работу.
Вот как это работает. Посмотрите на следующую команду:
: позвоните в somefile # Hello ()
Когда вы запустите эту команду, Vim будет вести себя немного иначе, чем обычный вызов функции.
Если эта функция уже загружена, Vim просто вызовет ее в обычном режиме.
В противном случае Vim будет искать файл с именем autoload / somefile.vim
в вашем ~ / .vim каталог
(и любые пакеты Pathogen).
Если этот файл существует, Vim загрузит / загрузит файл. Затем он попытается позвонить функция нормально.
Внутри этого файла функция должна быть определена следующим образом:
function somefile # Hello ()
"...
конечная функция
Вы можете использовать несколько символов #
в имени функции для представления
подкаталоги.Например:
: вызов myplugin # somefile # Hello ()
Это будет искать автоматически загруженный файл по адресу autoload / myplugin / somefile.vim
. В
функция внутри него должна быть определена с полным путем автозагрузки:
function myplugin # somefile # Hello ()
"...
конечная функция
Эксперименты
Чтобы понять, как это работает, давайте попробуем. Создавать
файл ~ / .vim / autoload / example.vim
и добавьте в него следующее:
ехом "Погрузка... "
функция! пример # Hello ()
echom "Привет, мир!"
конечная функция
echom "Загрузка завершена".
Сохраните файл и запустите : вызовите пример # Hello ()
. Vim выведет следующее:
Загрузка ...
Загрузка завершена.
Привет мир!
Эта небольшая демонстрация доказывает несколько вещей:
- Vim действительно загружает файл
example.vim
на лету. Его даже не существовало когда мы открыли Vim, он не мог быть загружен при запуске! - Когда Vim находит файл, необходимый для автозагрузки, он загружает весь файл перед фактически вызывая функцию.
Не закрывая Vim , измените определение функции, чтобы оно выглядело как это:
echom "Загрузка ..."
функция! пример # Hello ()
echom "ПРИВЕТ СНОВА, мир!"
конечная функция
echom "Загрузка завершена".
Сохраните файл и , не закрывая Vim , запустите : вызовите пример # Hello ()
. Vim будет
просто вывод:
Привет, мир!
Vim уже имеет определение для примера # Hello
, поэтому его не нужно перезагружать
файл, что означает:
- Код вне функции больше не запускался.
- Изменения функции не улавливаются.
Теперь запустите : вызовите пример # BadFunction ()
. Вы снова увидите сообщения о загрузке,
а также ошибка о несуществующей функции. Но теперь попробуйте запустить : call
example # Снова Hello ()
. На этот раз вы увидите обновленное сообщение!
К настоящему времени вы должны иметь довольно четкое представление о том, что происходит, когда Vim встречает вызов функции с именем в стиле автозагрузки:
- Он проверяет, есть ли уже определенная функция с таким именем.Если так, просто назови это.
- В противном случае найдите соответствующий файл (по имени) и создайте его.
- Затем попробуйте вызвать функцию. Если это сработает — отлично. Если не получится, просто распечатать ошибку.
Если это еще не совсем ясно, вернитесь и проработайте это демонстрацию снова и попытайтесь увидеть, где каждое правило вступает в силу.
Что загружать автоматически
Автозагрузка не бесплатна. Есть некоторые (небольшие) накладные расходы, связанные с его настройкой вверх, не говоря уже об уродливых именах функций, которые вам нужно добавить в свой код.
С учетом сказанного, если вы создаете плагин, который не будет использоваться каждые раз пользователь открывает сеанс Vim, вероятно, стоит переместить столько же функциональность в автоматически загружаемые файлы. Это снизит воздействие ваш плагин учитывает время запуска ваших пользователей, что важно, поскольку люди устанавливайте все больше и больше плагинов Vim.
Так какие вещи можно безопасно загружать в автозагрузку? Ответ в основном все, что напрямую не вызывается вашими пользователями. Сопоставления и пользовательские команды не могут быть загружены автоматически (потому что они не будут доступны для звонков пользователям), но может быть многое другое.
Давайте посмотрим на наш плагин Potion и посмотрим, что мы можем загрузить автоматически.
Добавление автозагрузки в плагин Potion
Начнем с функции компиляции и запуска. Помните, что наш ftplugin / potion / running.vim Файл
выглядел так в конце предыдущего
Глава
если! Существует ("g: potion_command")
пусть g: potion_command = "potion"
endif
функция! PotionCompileAndRunFile ()
тихо! ясно
выполнять "!" . g: potion_command."". bufname ("%")
конечная функция
функция! PotionShowBytecode ()
"Получите байт-код.
let bytecode = system (g: potion_command. "-c -V". bufname ("%"))
"Откройте новый раскол и настройте его.
vsplit __Potion_Bytecode__
обычный! ggdG
setlocal filetype = potionbytecode
setlocal buftype = nofile
"Вставьте байт-код.
call append (0, split (байт-код, '\ v \ n'))
конечная функция
nnoremap <буфер> r: вызвать PotionCompileAndRunFile ()
nnoremap <буфер> b: вызовите PotionShowBytecode ()
Этот файл уже вызывается только при загрузке файла зелья, поэтому он не добавляет к накладным расходам на запуск Vim в целом.Но могут быть некоторые пользователи, которые просто эта функция не нужна, поэтому, если мы можем автозагрузить ее, мы сохраняйте им несколько миллисекунд каждый раз, когда они открывают файл зелья.
Да, в этом случае экономия будет небольшой. Но я уверен, ты можешь представить плагин с тысячами строк функций, где время, необходимое для нагрузка на них была бы более значительной.
Приступим. Создайте файл autoload / potion / running.vim
в своем плагине
репо. Затем переместите в него две функции и измените их имена так, чтобы они выглядели
как это:
echom «Автозагрузка... "
функция! potion # running # PotionCompileAndRunFile ()
тихо! ясно
выполнять "!" . g: potion_command. "". bufname ("%")
конечная функция
функция! зелье # работает # PotionShowBytecode ()
"Получите байт-код.
let bytecode = system (g: potion_command. "-c -V". bufname ("%"))
"Откройте новый раскол и настройте его.
vsplit __Potion_Bytecode__
обычный! ggdG
setlocal filetype = potionbytecode
setlocal buftype = nofile
"Вставьте байт-код.
call append (0, split (байт-код, '\ v \ n'))
конечная функция
Обратите внимание на то, что часть имен функций potion #, выполняющая
, совпадает с
каталог и имя файла, в котором они живут.Теперь измените ftplugin / potion / running.vim
, чтобы он выглядел так:
если! Существует ("g: potion_command")
пусть g: potion_command = "potion"
endif
nnoremap <буфер> <локальный заголовок> r
\: вызвать зелье # работает # PotionCompileAndRunFile ()
nnoremap <буфер> <локальный заголовок> b
\: вызов зелья # работает # PotionShowBytecode ()
Сохраните файлы, закройте Vim и откройте файл factorial.pn
.Попробуйте использовать
сопоставления, чтобы убедиться, что они по-прежнему работают правильно.
Убедитесь, что вы видите диагностическое сообщение Autoloading ...
только первое
при запуске одного из сопоставлений (вам может потребоваться использовать : messages
, чтобы увидеть его).
Убедившись, что автозагрузка работает правильно, вы можете удалить это
сообщение.
Как видите, мы оставили вызовов nnoremap
, которые отображают ключи. Мы не можем
автозагрузить их, потому что у пользователя не будет возможности инициировать автозагрузку, если
мы сделали!
Это обычный шаблон, который вы увидите в плагинах Vim: большая часть их функций
будет храниться в автоматически загружаемых функциях, с помощью всего nnoremap
и команды
команды в файлах, которые Vim загружает каждый раз.Помните об этом всякий раз, когда
вы пишете нетривиальный плагин для Vim.
Упражнения
Прочтите : помогите автозагрузить
.
Поэкспериментируйте и выясните, как ведет себя автозагрузка переменных.
Предположим, вы хотите программно принудительно перезагрузить файл автозагрузки, который имеет Vim.
уже загружен, не беспокоя пользователя. Как ты мог это сделать? Вы можете
хочу прочитать : help: silent
. Пожалуйста, никогда не делайте этого в реальной жизни.
Linux: Как автоматически загружать модуль ядра во время загрузки
Как мне автоматически загружать модуль ядра Linux во время загрузки, чтобы мое оборудование автоматически распознавалось во время загрузки системы?Ядро Linux следует модульной конструкции ядра.Загружаемые модули ядра (LKM) — это объектные файлы, содержащие код для расширения работающего ядра или так называемого базового ядра. LKM обычно используются для добавления поддержки нового оборудования, файловых систем, сетевых адаптеров и многого другого.
Файл конфигурации
Загрузка модуля ядра — важная задача. Вам необходимо отредактировать файл с именем / etc / modules или поместить новый файл конфигурации в каталог /etc/modules-load.d/ . Используйте любой из способов загрузки модулей ядра. Файл конфигурации состоит из набора строк.Все пустые строки и весь текст в строке после # будут проигнорированы. Файл / etc / modules (или другие файлы в /etc/modules-load.d/ ) используется, если после установки добавляется новое оборудование, а для оборудования требуется модуль ядра, система должна быть настроена для загрузки правильный модуль ядра для нового оборудования.
Примеры
Например, если система включает IDE CD-ROM, файл конфигурации модуля содержит следующие 3 строки:
# vi / etc / modules
Добавьте следующие строки:
ide-cd
ide-core
cdrom
Сохраните и закройте файл.Для тестирования перезагрузите систему: \
# reboot
Другой вариант — загрузить драйверы без перезагрузки системы. Используйте команду modprobe:
# modprobe {driver-name}
# modprobe ide-cd
# modprobe ide-cd cdrom
Обратите внимание, что если вы используете Debian Linux или Ubuntu Linux , используйте файл / etc / modules файл вместо /etc/modules.conf (который работает в более старых версиях Red Hat / Fedora / CentOS Linux. В наши дни лучше использовать каталог / etc / modules-load.d / во всех дистрибутивах Linux.
Примечание о современных ядрах Linux
В наши дни udev используется для автоматической обработки модулей. Нет необходимости помещать модули в какой-либо файл конфигурации, так как udev позаботится об этом. Однако иногда вам все равно нужно добавить дополнительный модуль во время процесса загрузки или занести в черный список другой, чтобы ваш ноутбук или сервер Linux работал правильно. Например, модули ядра могут быть загружены во время загрузки в файлы в /etc/modules-load.d/. Например:
# cat / etc / modules-load.д / kvm.conf
kvm
kvm_intel
Задача: посмотреть, какие модули ядра загружены в данный момент
Введите команду lsmod:
$ lsmod
ИЛИ
$ lsmod | подробнее
Примеры выходов:
Рис.