Как я могу запускать скрипты автоматически при запуске Ubuntu, чтобы мне не приходилось запускать их вручную после запуска?
Как я могу запускать скрипты автоматически при запуске Ubuntu, чтобы мне не приходилось запускать их вручную после запуска?
Ответы:
В зависимости от того, какие скрипты вам нужно запускать. Для сервисов и тому подобного вы должны использовать upstart . Но для пользовательского сценария они должны запускаться gnome как сценарии сеанса! Загляните в «Система»> «Настройки»> «Запуск приложений».
Кроме того, если вам нужно запустить некоторые скрипты при входе в систему с терминала, вы можете добавить их в файл .bash_login в вашем домашнем каталоге.
Простая команда (которая не должна оставаться запущенной) может использовать задание Upstart, например:
start on startup
task
exec /path/to/command
Сохраните это в .confфайле /etc/init(если вам нужно, чтобы он запускался от имени root при загрузке системы), или в ~/.config/upstart(если вам нужно, чтобы он работал от имени пользователя при входе в систему).
system->pref->startup applicationsмогут быть найдены /etc/init/ни в, ни в ~/.config/upstart. Так, где определены приложения запуска?
Одним из подходов является добавление задачи @reboot cron :
crontab -eпозволит вам редактировать свой хрон.Добавляем к нему такую строку:
@reboot /path/to/script
выполнит этот скрипт после загрузки вашего компьютера.
@rebootКлючевое слово хороший наконечник , потому что это не так широко известны.
man 5 crontabговорит, что @rebootвыполняется при запуске (при запуске демона cron).
rc.localкогда система кажется более настроенной к этому моменту (PATH и т. Д.). Странно, что так сложно что-то назвать после запуска системы ..
Как насчет добавления команды в /etc/rc.local? вам придется использовать доступ sudo, хотя для редактирования этого файла.
sudo nano /etc/rc.local
chmod 755 rc.localи добавить #!/bin/bashв первую строку.
Чтобы выполнить (недолговечную) команду 1 при запуске с помощью systemd, вы можете использовать системный блок типа OneShot. Например, создать, /etc/systemd/system/foo.serviceсодержащий:
[Unit]
Description=Job that runs your user script
[Service]
ExecStart=/some/command
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Затем запустите:
sudo systemctl daemon-reload
sudo systemctl enable foo.service
По сути, это просто преобразование типичного задания Upstart в systemd (см. Systemd для пользователей Upstart ).
Вы можете запустить несколько команд из одного и того же служебного файла, используя несколько ExecStartстрок:
[Service]
ExecStart=/some/command
ExecStart=/another/command some args
ExecStart=-/a/third/command ignore failure
Команда всегда должна указываться с полным путем. Если какая-либо команда не выполняется, остальные не запускаются. Перед -тем, как путь указывает systemd игнорировать ненулевой статус выхода (вместо того, чтобы считать его неудачным).
Актуальны:
Для пользовательских сессий вы можете ~/.config/systemdвместо этого создать системный модуль . Это должно работать с 16.04 и выше, но не с более ранними выпусками Ubuntu с systemd (так как те все еще использовали Upstart для пользовательских сессий). Сеансами пользователя можно управлять с помощью тех же команд, что и с системными службами, но с --userдобавленной опцией:
systemctl --user daemon-reload
systemctl --user status foo.service
Обратите внимание, что, в отличие от Upstart, systemd не запускает Exec*команды через оболочку. Он выполняет некоторое ограниченное расширение переменных и несколько команд (разделенных ;), но это все, что касается оболочечного синтаксиса. Для чего-то более сложного, скажем, перенаправление или каналы, оберните вашу команду в sh -c '...'или bash -c '...'.
1 В отличие от долгоживущих демонов.
WantedByЗдесь используется, например, позволяет начать , когда multi-user.targetдостигается. Вы можете использовать Before, After, Requiresи т.д. Смman systemd.unit
RemainAfterExitзависит от того, какую службу вы запускаете и от какого поведения. Например, /bin/df -h<s> бы </ s> должен был иметь RemainAfterExit=no.
dfэтим потребностям RemainAfterExit=no. Если вы не хотите многократно выполнять команду при каждом запуске systemctl start foo.
Существуют разные способы автоматического запуска команд:
Система upstart выполнит все сценарии, из которых она найдет конфигурацию в каталоге /etc/init. Эти сценарии будут запускаться во время запуска системы (или в ответ на определенные события, например, запрос на выключение), и поэтому являются местом для запуска команд, которые не взаимодействуют с пользователем; все серверы запускаются с использованием этого механизма.
Вы можете найти читаемое введение по адресу: http://upstart.ubuntu.com/getting-started.html справочные страницы man 5 initи man 8 initдать вам полную информацию.
Сценарий оболочки, указанный .gnomercв вашем домашнем каталоге, автоматически создается при каждом входе в сеанс GNOME. Вы можете поместить произвольные команды там; Переменные окружения, которые вы установили в этом скрипте, будут видны любой программе, запущенной в вашем сеансе.
Обратите внимание, что сессия не начинается, пока .gnomercскрипт не завершится; следовательно, если вы хотите автоматически запустить какую-то долго работающую программу, вам нужно добавить &ее в вызов программы, чтобы отсоединить ее от работающей оболочки.
Пункт меню « Система» -> «Настройки» -> «Запуск приложений» позволяет определить, какие приложения следует запускать при запуске графического сеанса (Ubuntu предопределяет довольно много), а также добавлять или удалять их по своему вкусу. Это имеет почти то же самое назначение и область действия .gnomercсценария, за исключением того, что вам не нужно знать shсинтаксис (но вы также не можете использовать какую-либо shпрограммную конструкцию).
.gnomercочевидно, запускается до загрузки Unity и, Startup Applicationsочевидно, запускается после загрузки Unity. Мне пришлось запустить программу, которая находится в строке меню Unity, и это имело огромное значение в этом случае!
sudo update-rc.d myscript.sh defaultsгде /etc/init.d/myscript.sh - ваш скрипт, также запускает его при запуске.
$HOME/.config/autostart
.desktop Здесь можно поместить файл, который будет выполнен при запуске.Пример примера для .desktopфайла:
Поместить следующий .desktopфайл в $HOME/.config/autostartи дано chmod +x:
[Desktop Entry]
Type=Application
Exec="</path/to/script>"
Hidden=false
NoDisplay=false
X-GNOME-Autostart-enabled=true
Name=Startup Script
Здесь "</path/to/script>"заменяется путь к вашему script.sh
(обычно рекомендуется /usr/local/binтак, что может быть выполнен непосредственно командой скажем, myscriptзаменен на "</path/to/script>").
Пример примера script.sh:
#!/bin/bash
<commands to be executed>
exit
Результат:
.desktopфайл будет запущен из $HOME/.config/autostartкоторого выполнить скриптExec=
Следовательно, вы можете запустить желаемый сценарий оболочки при запуске!
Для простых вещей вы можете добавить команду System-> Preferences-> Sessions, указывающую местоположение вашего скрипта.
В качестве альтернативы вы можете добавить его в /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 cron
Jan 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-02
Jan 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 root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 02 16:54:40 alien CRON[952]: pam_unix(cron:session): session closed for user root
Jan 02 16:54:40 alien cron[919]: sendmail: Cannot open smtp.gmail.com:587
Jan 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.d
total 44
drwxr-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/sh
PATH=/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-vmlinuz
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
@reboot root touch "/boot/vmlinuz-"`uname -r`
@reboot.
crontab -eчто некоторые считают одним из черных искусств из-за vim-подобного интерфейса. С другой стороны, этот ответ может понравиться тем, чей мозг подключен определенным образом. Мы не все отлиты из одной и той же формы. С другой стороны, этот ответ уже имеет один отрицательный голос, поэтому мы позволим демократии пойти своим путем.
crontab -e, вспоминает звездочки ("*") на минуты, часы и т. Д., Которые я всегда находил, для которых мне нужны инструкции Google. Я все еще нахожу использование /etc/cron.dи /etc/cron.dailyмой выбор. Тем более, что это зеркала /etc/udev/rules.dи /etc/systemd/system-sleepметоды. Это просто кажется хорошей подгонкой.
Вы должны использовать выскочку для этого. Upstart используется для процессов Ubuntu, которые запускаются автоматически. Это улучшенное решение, подобное старым сценариям System-V init.d. Это также позволяет вам поставить предварительные условия для запуска вашего скрипта (т.е. вам нужна работающая сеть? И т. Д.)