Как я могу запускать скрипты автоматически когда Ubuntu запускается, чтобы мне не приходилось запускать их вручную после запуска?
Один из подходов заключается в добавлении @reboot хрон задача:
- Бегущий
crontab -e
позволит вам редактировать свой cron. -
Добавление к нему такой строки, как эта:
@reboot /path/to/script
выполнит этот скрипт, как только ваш компьютер загрузится.
В зависимости от того, какие скрипты вам нужно запустить.. Для услуг и тому подобного вы должны использовать выскочка. Но для пользовательского скрипта они должны запускаться gnome как сеансовые скрипты! Загляните в раздел "Системные настройки" и "Приложения для запуска".
В качестве примечания, если вам нужны какие-то скрипты для запуска при входе в терминал, вы можете добавить их в .bash_login файл в вашем домашнем каталоге.
Для 14.04 и старше
Простая команда (та, которая не должна оставаться запущенной) может использовать начальное задание, например:
start on startuptaskexec /path/to/command
Сохраните это в .conf
файл в /etc/init
(если вам нужно, чтобы он запускался от имени root при загрузке системы), или в ~/.config/upstart
(если вам нужно, чтобы он запускался от имени вашего пользователя при входе в систему).
Вы можете добавлять команды в /etc/rc.local
:
sudo nano /etc/rc.local
Это выполняет команды от имени root.
Чтобы выполнять команды от имени определенного пользователя, используйте sudo -i -u
(-i
чтобы также запустить оболочку входа в систему). Например, для создания постоянного SSH-туннеля, где myhost
определяется в johndoe
s ~/.ssh/config
файл:
sudo -i -u johndoe autossh -nNT -L 1234:localhost:1234 myhost
Обратите внимание, что если /etc/rc.local
не существовал (как это имеет место в Ubuntu с 16.04), вам нужно добавить линия шебанга вверху (например, #!/bin/bash
) и убедитесь, что файл является исполняемым:
sudo chmod a+x /etc/rc.local
Для 15.04 и более поздних версий:
Для запуска (недолговечного)1 команда при запуске с использованием systemd
, вы можете использовать системный блок типа OneShot
. Например, создайте /etc/systemd/system/foo.service
содержащий:
[Unit]Description=Job that runs your user script[Service]ExecStart=/some/commandType=oneshotRemainAfterExit=yes[Install]WantedBy=multi-user.target
Тогда беги:
sudo systemctl daemon-reloadsudo systemctl enable foo.service
По сути, это просто преобразование типичная работа выскочки к системному (см. Systemd для начинающих пользователей).
Вы можете запускать несколько команд из одного и того же служебного файла, используя несколько ExecStart
линии:
[Service]ExecStart=/some/commandExecStart=/another/command some argsExecStart=-/a/third/command ignore failure
Команда всегда должна быть дана с полным путем. Если какая-либо команда завершается ошибкой, остальные не выполняются. A -
перед тем, как путь укажет systemd игнорировать ненулевой статус выхода (вместо того, чтобы считать его ошибкой).
Подходящий:
Для пользовательских сеансов вы можете создать модуль systemd в ~/.config/systemd
вместо. Это должно работать с 16.04 и далее, но не с более ранними версиями Ubuntu с systemd (поскольку они все еще использовали Upstart для пользовательских сеансов). Блоками пользовательских сеансов можно управлять с помощью тех же команд, что и с помощью системных служб, но с помощью --user
добавлена опция:
systemctl --user daemon-reloadsystemctl --user status foo.service
Синтаксис оболочки
Обратите внимание, что, в отличие от Upstart, systemd не запускает Exec*
команды через оболочку. Он выполняет некоторое ограниченное расширение переменной и несколько команд (разделенных ;
) сам по себе, но это все, что касается синтаксиса, подобного оболочке. Для чего-то более сложного, скажем, перенаправления или каналов, оберните свою команду в sh -c '...'
или bash -c '...'
.
1В отличие от долгоживущих демонов.
Существуют различные способы автоматического выполнения команд:
-
То выскочка система выполнит все скрипты, из которых она найдет конфигурацию в каталоге
/etc/init
. Эти сценарии будут выполняться во время запуска системы (или в ответ на определенные события, например, запрос на завершение работы) и поэтому являются местом для выполнения команд, которые не взаимодействуют с пользователем; все серверы запускаются с использованием этого механизма.Вы можете найти читаемое введение в at: http://upstart.ubuntu.com/getting-started.html справочные страницы
man 5 init
иman 8 init
сообщу вам все подробности. -
Сценарий оболочки с именем
.gnomerc
в вашем домашнем каталоге автоматически создается каждый раз, когда вы входите в сеанс GNOME. Вы можете поместить туда произвольные команды; переменные среды, которые вы задаете в этом скрипте, будут видны любой программе, которую вы запускаете в своем сеансе.Обратите внимание, что сеанс не начнется до тех пор, пока
.gnomerc
сценарий завершен; поэтому, если вы хотите автоматически запустить какую-либо длительно работающую программу, вам необходимо добавить&
к вызову программы, чтобы отсоединить ее от запущенной оболочки. Пункт меню Система -> Настройки -> Запуск приложений позволяет вам определять, какие приложения следует запускать при запуске вашего графического сеанса (Ubuntu определяет довольно много), и добавлять или удалять их по своему вкусу. Это имеет почти ту же цель и сферу охвата, что и
.gnomerc
сценарий, за исключением того, что вам не нужно знатьsh
синтаксис (но вы также не можете использовать какой-либоsh
программная конструкция).
$HOME/.config/autostart
содержит список приложений для запуска. .desktop
файлы в этой папке будут выполняться при запуске. Для этого может потребоваться разрешение на исполняемый файл (chmod +x startup.desktop
).
Примерный пример для .desktop
файл:
[Desktop Entry]Type=ApplicationExec="</path/to/script>"Hidden=falseNoDisplay=falseX-GNOME-Autostart-enabled=trueName=Startup Script
Здесь "</path/to/script>"
заменяется на путь к вашему script.sh
Если вы разместите свой сценарий myscript
в /usr/local/bin
чтобы его можно было выполнить непосредственно с помощью команды, вы можете написать myscript
вместо "</path/to/script>"
.
Примерный пример myscript.sh
:
#!/bin/bash<commands to be executed>exit
Результат:.desktop
файл будет запущен из $HOME/.config/autostart
который выполняет скрипт с помощью Exec=
Для простых вещей вы можете добавить команду в >>Система-Настройки-Сеансы указывающий на местоположение вашего скрипта.
В качестве альтернативы вы можете добавить его в /etc/init.d/rc.local или создать выскочка работа, если это более низкий уровень материал.
Взгляните на https://help.ubuntu.com/community/UbuntuBootupHowto для получения дополнительной информации
cron
реализованный ответ отличается от того, за который проголосовали лучшие
Этот ответ по-прежнему использует cron
но использует другой метод, чем лучший проголосовавший ответ. Это работает с Ubuntu 16.04, но, вероятно, поддерживается намного раньше. Просто я начал использовать cron
для выполнения заданий при загрузке компьютера с 16.04.
Когда это происходит cron
бежать?
В комментариях кто-то спросил "когда они запускаются?". Вы можете сообщить об этом в syslog / journalctl:
$ journalctl -b | grep cronJan 02 16:54:40 alien cron[919]: (CRON) INFO (pidfile fd = 3)Jan 02 16:54:40 alien cron[919]: (CRON) INFO (Running @reboot jobs)Jan 02 16:54:40 alien systemd[1]: Started Run anacron jobs.Jan 02 16:54:40 alien anacron[949]: Anacron 2.3 started on 2018-01-02Jan 02 16:54:40 alien anacron[949]: Normal exit (0 jobs run)Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[951]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session opened for user root by (uid=0)Jan 02 16:54:40 alien CRON[985]: (root) CMD ( /usr/local/bin/cron-reboot-cycle-grub-background)Jan 02 16:54:40 alien CRON[954]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user rootJan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587Jan 02 16:54:40 alien CRON[950]: pam_unix(cron:session): session closed for user root
Следует отметить одну вещь: cron
могу отправить вам по электронной почте статус выполненных заданий и @reboot
задания выполняются так рано, что сетевой менеджер и электронная почта не будут запущены, если вы не поставите sleep
команду в ваш сценарий (ы).
Куда поместить ваши скрипты
Поместите свои скрипты в каталог /etc/cron.d
:
$ ll /etc/cron.dtotal 44drwxr-xr-x 2 root root 4096 Nov 26 19:53 ./drwxr-xr-x 139 root root 12288 Dec 31 13:58 ../-rw-r--r-- 1 root root 244 Dec 28 2014 anacron-rw-r--r-- 1 root root 148 Feb 18 2017 cycle-grub-background-rw-r--r-- 1 root root 138 Mar 5 2017 display-auto-brightness-rw-r--r-- 1 root root 460 Nov 26 19:53 nvidia-hdmi-sound-rw-r--r-- 1 root root 102 Feb 9 2013 .placeholder-rw-r--r-- 1 root root 224 Nov 19 2016 touch-vmlinuz-rw-r--r-- 1 root root 700 Aug 5 11:15 turn-off-hyper-threading
Как выглядит сценарий?
Вот пара сценариев, которые я настроил для запуска каждой загрузки:
$ cat /etc/cron.d/cycle-grub-background SHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin @reboot root /usr/local/bin/cron-reboot-cycle-grub-background$ cat /etc/cron.d/touch-vmlinuzSHELL=/bin/shPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin@reboot root touch "/boot/vmlinuz-"`uname -r`
Вы должны использовать выскочка за это. Upstart используется для процессов Ubuntu, которые запускаются автоматически. Это усовершенствованное решение, подобное старым сценариям System-V init.d. Это также позволяет вам ввести предварительные условия для запуска вашего скрипта (т.Е. Нужна ли вам запущенная сеть? и т.д.)
Если вы хотите, чтобы ваш скрипт запускался до systemd сразу после запуска ядра, AFAIK - это добавление init=/path/to/script
в командную строку ядра в /boot/grub/grub.cfg
или более перспективный вариант сделать свой собственный пункт меню в /etc/grub.d/40_custom
скопировав пункт меню из /boot/grub/grub.cfg
и внесение необходимых изменений (и запуск update-grub
после этого для grub
чтобы добавить свой пользовательский файл в /boot/grub/grub.cfg
).
linux /boot/vmlinuz-5.4.0-26-generic ... ro quiet splash
перейти на
linux /boot/vmlinuz-5.4.0-26-generic ... ro quiet splash init=/path/to/script
Позаботьтесь о том, чтобы правильно поместить, например #!/bin/bash
на первой строке и exec /sbin/init
(если /sbin/init
существует в вашей системе - в моей он указывает на systemd) в конце, чтобы избежать паники ядра.
Если бы кто-нибудь мог также показать, КОГДА и ГДЕ это было бы потрясающе. Я говорю это, потому что знаю, что есть по крайней мере 2 способа запустить скрипт, который запустится до запуска других приложений (например, X11).
+1 к @GabrielFair. БОЛЬШАЯ часть проблемы заключается в том, что первоначальному вопросу и ответу ДЕСЯТЬ ЛЕТ. Я бы также добавил, что существует слишком много способов решить эту проблему. Что случилось с простотой философии Unix?! Попросите кого-нибудь * знающего * и с достаточным количеством баллов переписать этот пост или добавить новый, актуальный, окончательный ответ для современных версий ОС.
Вся эта ветка ответов - сплошная неразбериха. Формат обмена стеком, похоже, не лучше всего подходит для этого вопроса