Выполнение команды при запуске Linux

Обновлено: 22.11.2024

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

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

В этой независимой от дистрибутива статье мы обсудим традиционные методы достижения этих целей в Linux.

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

Выполнение сценариев Linux во время перезагрузки или запуска

Существует два традиционных метода выполнения команды или запуска сценариев во время запуска:

Помимо обычного формата (минута/час/день месяца/месяц/день недели), который широко используется для указания расписания, планировщик cron также позволяет использовать @reboot . Эта директива, за которой следует абсолютный путь к сценарию, заставит его запускаться при загрузке машины.

Однако при таком подходе есть две оговорки:

  1. a) должен быть запущен демон cron (что происходит при нормальных обстоятельствах) и
  2. b) сценарий или файл crontab должен включать переменные среды (если они есть), которые потребуются (дополнительные сведения см. в этой ветке StackOverflow).

Этот метод действителен даже для дистрибутивов на основе systemd. Чтобы этот метод работал, вы должны предоставить разрешения на выполнение для /etc/rc.d/rc.local следующим образом:

и добавьте свой сценарий внизу файла.

На следующем изображении показано, как запустить два примера сценариев ( /home/gacanepa/script1.sh и /home/gacanepa/script2.sh ) с использованием задания cron и rc.local соответственно, и их соответствующие результаты.

Имейте в виду, что обоим скриптам должны быть предоставлены разрешения на выполнение ранее:

Выполнение сценариев Linux при входе в систему и выходе из нее

Чтобы выполнить сценарий при входе в систему или выходе из нее, используйте ~.bash_profile и ~.bash_logout соответственно. Скорее всего, вам нужно будет создать последний файл вручную. Просто поместите строку, вызывающую ваш скрипт, внизу каждого файла так же, как и раньше, и вы готовы к работе.

Обзор

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

Если вам понравилась эта статья, подпишитесь на уведомления по электронной почте о руководствах по Linux. Если у вас есть вопросы или сомнения? обратитесь за помощью в разделе комментариев.

Если вы цените то, что мы делаем здесь, в TecMint, вам следует подумать о следующем:

TecMint – это самый быстрорастущий и пользующийся наибольшим доверием сайт сообщества, где можно найти любые статьи, руководства и книги по Linux в Интернете. Миллионы людей посещают TecMint! для поиска или просмотра тысяч опубликованных статей, доступных всем БЕСПЛАТНО.

Если вам нравится то, что вы читаете, купите нам кофе (или 2) в знак признательности.

Мы благодарны за вашу бесконечную поддержку.

Похожие записи

12 мыслей на тему «Как автоматически выполнять команды/скрипты во время перезагрузки или запуска»

Я хочу запускать эту команду под обычным пользователем, а не как root каждый раз, когда мой VPS перезагружается, это дешевый VPS, на котором все еще работает Centos 5

похоже, что это руководство выполняется как root

Это сработало именно так, как мне было нужно. rc.local был тем, что мне было нужно для создания раздела «золотого диска» для различного оборудования.

В Linux Mint нет папки rc.d, но есть rc0.d, rc1.d до rc6.d/etc/rc.local не выполняется в Linux Mint, но существует.

Существует файл /etc/init.d/rc.local, который предположительно выполняет /etc/rc.local, но не выполняет его.

/etc/profile можно сделать исполняемым, и здесь можно выполнить общесистемные настройки.

Более того, я написал сценарий запуска, поместил его в свой локальный каталог bin и добавил его в программы запуска Mint Mate.

Теперь я могу редактировать без привилегий суперпользователя и устанавливать всевозможные вещи.

Все стало просто сумасшедшим, когда я добавил новый внешний монитор HDMI, сенсорный экран, звук и все необходимые настройки.

rc.local устарел, используйте вместо него systemd

Кажется, я припоминаю, что можно запускать скрипт как побочный эффект команды «shutdown».

Какой шрифт использован на снимке экрана?
Спасибо

Что делать, если у меня нет папки rc.d, а есть только папки с rc0.d по rc6.d.

Если вы используете Centos или rhel 7, вам необходимо дополнительно активировать одну службу.

PERjham, это сработало как по маслу. Спасибо за это

Спасибо, что указали на это!

Есть что сказать? Присоединяйтесь к обсуждению. Отменить ответ

Этот сайт использует Akismet для уменьшения количества спама. Узнайте, как обрабатываются данные ваших комментариев.

Мне нужно, чтобы этот сценарий запускался каждый раз при запуске системы (даже если никто не входит в систему). Что мне нужно сделать, чтобы это произошло?

5 ответов 5

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

со следующим содержанием:

со следующим содержанием

Официальное заявление с веб-сайта выскочки -> «Проект находится только в режиме сопровождения. Новые функции не разрабатываются, и общий совет — перейти на другую минимальную систему инициализации или systemd».

Создайте новый скрипт в /etc/init.d/myscript .

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

Сделать его исполняемым.

Настройте систему инициализации для запуска этого сценария при запуске.

То же самое можно сделать, написав короткое задание Upstart. Однако сценарии инициализации по-прежнему поддерживаются и просты в использовании.

Вам не нужен root или даже вход в систему.

Вы можете отредактировать свой crontab ( crontab -e ) и создать такую ​​запись:

Таким образом, вы можете запустить его как обычный пользователь. @reboot просто означает, что он запускается при запуске компьютера (не обязательно только при перезагрузке).

P.S.: Что касается комментариев о том, что это не работает должным образом

Некоторые говорят, что это не работает в дистрибутивах на основе Debian, таких как Ubuntu. Я лично успешно использовал этот метод как на Ubuntu, так и на Mint. Однако есть несколько моментов, которые следует учитывать.

Задания @reboot запускаются при запуске демона cron. Я обнаружил, что в дистрибутивах на основе Debian это может произойти до того, как будет смонтирован раздел /home. Если скрипт, который вы запускаете, находится в вашей домашней папке, произойдет сбой.

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

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

Наконец, опять же, это не ограничивается дистрибутивами на основе Debian, но cron работает в гораздо более ограниченной среде, чем ваша оболочка. В частности, у переменной PATH гораздо меньше путей. Возможно, что выполняемая команда не найдена, например, если она находится в чем-то вроде $HOME/.local/bin , который может быть в вашем PATH в сеансе оболочки, но не в cron . Возможно даже, что выполняемая команда зависит от какой-то переменной среды, которая не задана в cron.

Итак, есть ряд причин, по которым ваша команда будет выполняться под управлением cron, но не потому, что @reboot не работает в вашем дистрибутиве.

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

Для системы инициализации Sys V:

Для системы systemd:

Иногда может потребоваться добавить пользовательский сценарий, команду или службу при запуске/загрузке. Если да, то как вы это делаете?

В этой статье давайте разберемся, как использовать следующие три метода для его реализации:

  • Использование файла /etc/rc.d/rc.local
  • Использование файла crontab
  • служба systemd

Способ 1: использование файла /etc/rc.d/rc.local

Файл «/etc/rc.local» традиционно выполняется после запуска всех обычных компьютерных служб в конце процесса переключения на многопользовательский уровень выполнения.

Этот метод также работает в системе systemd, и вам нужно добавить расположение вашего скрипта в файл ‘/etc/rc.d/rc.local’, чтобы он запускался при загрузке.

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

Чтобы понять это подробнее, мы создадим простой скрипт, как показано ниже, но вы можете создать любой скрипт по мере необходимости:

После того как сценарий будет готов, установите права доступа к исполняемому файлу, как показано ниже:

Наконец добавьте скрипт в конец файла:

Перезагрузите систему, чтобы проверить это:

Метод 2: Использование файла crontab

cron автоматически выполняет запланированные задания в серверной части в определенное время.

Этого легко добиться с помощью специальной строки "@reboot" с заданием cron.

@reboot — это специальная строка, которая позволяет пользователю запускать любую команду или сценарий при запуске (во время загрузки).

В этом примере файл ‘/opt/scripts/run-script-on-boot.sh’ запускается при перезагрузке системы.

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

Перезагрузите систему, чтобы проверить следующее:

Способ 3: Использование сервисного модуля systemd

Этот метод работает только в системе systemd и очень прост.

Для этого вам нужно создать сценарий запуска systemd и поместить его в каталог «/etc/systemd/system/».

Это наш пример скрипта запуска systemd:

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

Перезагрузите систему, чтобы проверить следующее:

Дополнительные советы:

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

Если вы хотите запустить команду от имени другого пользователя, используйте следующий формат:

Заключение

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

Может возникнуть необходимость выполнить команду или сценарий при перезагрузке или каждый раз, когда мы запускаем нашу систему. Итак, как мы можем это сделать, в этом уроке мы собираемся обсудить именно это. Мы обсудим, как заставить наши системы CentOS/RHEL и Ubuntu выполнять команду или сценарии при перезагрузке или при запуске системы, используя два разных метода. Оба метода проверены и прекрасно работают,

Способ 1 — Использование rc.local

В этом методе мы будем использовать файл «rc.local», расположенный в «/etc/», для выполнения наших скриптов и команд при запуске. Мы сделаем запись для выполнения скрипта в файле, и каждый раз, когда наша система запускается, скрипт будет выполняться.

Но сначала мы предоставим разрешения, чтобы сделать файл /etc/rc.local исполняемым,

$ sudo chmod +x /etc/rc.local

Далее мы добавим скрипт для выполнения в файл,

$ sudo vi /etc/rc.local

и внизу файла добавьте запись

ш /root/script.sh &

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

$ какая команда

$ какой затвор

/usr/bin/затвор

Для CentOS мы используем файл '/etc/rc.d/rc.local' вместо '/etc/rc.local'. Нам также необходимо сделать этот файл исполняемым, прежде чем добавлять в него какой-либо скрипт или команду.

Примечание. При выполнении скрипта при запуске убедитесь, что скрипт заканчивается на «выход 0».

Способ 2 — метод Crontab

Этот метод является самым простым из двух методов. Мы создадим задание cron, которое будет ждать 90 секунд после запуска системы, а затем выполнит команду или сценарий в системе.

Чтобы создать задание cron, откройте терминал и запустите

$ crontab -e

& введите следующую строку,

@reboot ( сон 90 ; sh /location/script.sh )

где /location/script.sh — это расположение скрипта, который нужно выполнить.

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

Если вы считаете, что мы помогли вам или просто хотите поддержать нас, обратите внимание на следующее: -

Linux TechLab благодарит вас за постоянную поддержку.

Поделиться статьей:

Шусейн

Увлечен Linux и открытым исходным кодом. Любит учиться, читать и писать о Linux, а также о новых технологиях.

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

Команда ЧПУ (NCAT) для начинающих

15 комментариев

Здравствуйте, косая черта и обратная косая черта правильные?
@reboot ( sleep 90 ; sh \location\script.sh )
или
@reboot ( sleep 90 ; sh /location/script.sh )

Спасибо, что указали на , это должно быть ‘/location/script.sh’.
Обновление статьи.

Привет! Спасибо за полезную информацию.
Я установил TightVNC на свой (безголовый) файловый сервер, на котором работает Ubuntu 18.04 LTS 64bit.
Я запускаю vnc-сервер с помощью
$ vncserver -geometry 1280×720 -depth 24
Новый рабочий стол X — krt1293:1

Запуск приложений, указанных в /home/bob/.vnc/xstartup
Файл журнала: /home/bob/.vnc/krt1293:1.log

Хорошо.
Я получаю доступ к нему со своего основного ПК (Xubuntu 16.04 LTS 64bit) с помощью Reminna.
Я бегу,

$ ssh -L 5901:localhost:5901 -N -f -l IP-адрес пользователя

Затем я могу подключиться с помощью Remmina с настройками,
Протокол: VNC — Virtual Network Computing
Сервер: localhost:5901

Соединение установлено, и на данный момент все работает нормально.
Затем я решил настроить так, чтобы vncserver запускался при загрузке с помощью crontab.

Открыл пользовательский файл crontab с помощью
$ crontab -e
Добавил следующую строку внизу и сохранил,
@reboot sleep 90 ; sh /location/script.sh
Перезагрузка — cron не удалось запустить vncserver
Отредактировал следующую строку внизу и сохранил,
@reboot sleep 90 ; ш /location/script.sh

Перезагрузка – cron не удалось запустить vncserver
Отредактировал следующую строку внизу и сохранил,
@reboot (vncserver -геометрия 1280×720 -глубина 24:1)
Перезагрузился – cron не удалось запустить vncserver
Отредактировал следующую строку внизу и сохранил,
@reboot ( vncserver -geometry 1280×720 - depth 24 : 1 )
Перезагрузка – cron не удалось запустить vncserver
/>Я добавил новое задание в crontab, чтобы убедиться, что crontab выполняется при запуске,
@reboot ( touch /home/bob/tmp/cron_test )

Сбой crontab "vncserver", но crontab "touch" выполнен успешно. Любые мысли о том, что я делаю неправильно?
Гарри

Повторите попытку, указав полный путь к vncserver, например, ‘/usr/bin/vncserver’. Тем временем я попытаюсь воспроизвести его на одной из своих машин.

Мне приходится активировать мое оборудование Wi-Fi каждый раз, когда я перезагружаю свою систему с помощью этой команды «sudo modprobe -v b43», и я хочу упростить эту задачу. Как вы думаете, я могу предоставить привилегии sudo?

спасибо за ваше время и помощь

Быстрый поиск в Google с ключевым словом «Постоянная загрузка модуля» даст вам нужное решение.
Также я опубликую статью о том же в ближайшие недели.

мне нужно запустить исполняемый файл qt при автозагрузке
crontab -e
@reboot /home/ssbc/Desktop/layout1

layout1 — это исполняемый файл qt

Привет, как выйти из редактора crontab?

:wq, как если бы мы вышли из редактора vi/vim.

Если файл script.sh является исполняемым, нужна ли команда sh?
Будет ли работать @reboot ( sleep 90 ; /location/script.sh )?

Мне нужно запустить скрипт при запуске, скрипт находится в корневом каталоге и в crontab я добавил строку @reboot /root/vm_subnet.sh
но он не запускает скрипт при перезагрузке или запуске (я предполагаю, что они оба одинаковы из цикла загрузки POV). Я делаю что-то не так здесь? Есть предложения?

crontab зависит от пользователя. Есть ли у вашего пользователя root-доступ?

Это зависит от пользователя, но для запуска скриптов при запуске у вас должен быть root-доступ.

crontab зависит от пользователя. Есть ли у вашего пользователя root-доступ?

Это зависит от пользователя, но для запуска скриптов при запуске у вас должен быть root-доступ.

Читайте также: