Если бы кто-то мог показать и WHEN, и WHERE, это было бы здорово. Я говорю это, потому что знаю, что есть как минимум 2 способа запуска скрипта, который будет запускаться до запуска других приложений (например, X11)
Buttink
1
Вся эта ветка ответов - беспорядок. Формат Stack Exchange, кажется, не подходит лучше всего для этого вопроса
Gabriel Fair
1
Это на самом деле довольно интересно. Сколько может быть разных способов?
devios1
Ответы:
206
В зависимости от того, какие скрипты вам нужно запускать. Для сервисов и тому подобного вы должны использовать upstart . Но для пользовательского сценария они должны запускаться gnome как сценарии сеанса! Загляните в «Система»> «Настройки»> «Запуск приложений».
Кроме того, если вам нужно запустить некоторые скрипты при входе в систему с терминала, вы можете добавить их в файл .bash_login в вашем домашнем каталоге.
Для 14.04 и старше
Простая команда (которая не должна оставаться запущенной) может использовать задание Upstart, например:
start on startup
task
exec /path/to/command
Сохраните это в .confфайле /etc/init(если вам нужно, чтобы он запускался от имени root при загрузке системы), или в ~/.config/upstart(если вам нужно, чтобы он работал от имени пользователя при входе в систему).
Учитывая, как работает SO и StackExchange, не могли бы вы привести пример сценария upstart и где он будет размещен? Это сделало бы это намного лучшим ответом. Ваша ссылка говорит, что это не поддерживается, и посмотрите на выскочку поваренной книги, которая является huuuge. У меня не так много идей, с чего начать.
Этеш Чоудхури
2
Что делать, если мне нужно запустить команду от имени пользователя root?
Допатрам
1
@dopatraman В ответе говорится, что все процессы с этим запущены от имени пользователя root.
AStopher
4
Пожалуйста, обновите этот ответ, чтобы объяснить, что делать в системах с systemd, а не с upstart (Ubuntu 15.04+).
3
Этот ответ не имеет смысла для меня. Приложения, перечисленные в, не system->pref->startup applicationsмогут быть найдены /etc/init/ни в, ни в ~/.config/upstart. Так, где определены приложения запуска?
phil294
554
Одним из подходов является добавление задачи @reboot cron :
Запуск crontab -eпозволит вам редактировать свой хрон.
Добавляем к нему такую строку:
@reboot /path/to/script
выполнит этот скрипт после загрузки вашего компьютера.
@rebootКлючевое слово хороший наконечник , потому что это не так широко известны.
jathanism
12
Приятно. Есть идеи , когда именно это срабатывает?
Оли
2
Итак ... это не запустится, если я потеряю питание и компьютер снова включится после восстановления питания?
Майк Уиллс
18
@siamii: man 5 crontabговорит, что @rebootвыполняется при запуске (при запуске демона cron).
Jfs
9
Это круто. Пока что это выглядит лучше, чем rc.localкогда система кажется более настроенной к этому моменту (PATH и т. Д.). Странно, что так сложно что-то назвать после запуска системы ..
Karthik T
161
Как насчет добавления команды в /etc/rc.local? вам придется использовать доступ sudo, хотя для редактирования этого файла.
Это напрямую отвечает на вопрос: как просто выполнить некоторые сценарии при загрузке вашей системы. upstart выполняет более сложную задачу: запускает процессы демона.
Dogweather
1
Таким образом, upstart запускает процессы-демоны, а /etc/rc.local запускает сценарии bash?
Донато
5
Должно ли это? Это больше не работает в наши дни, верно?
DaVince
4
Работайте с Ubuntu 17.04 systemd
qodeninja
3
Обратите внимание, что если вы создадите этот файл самостоятельно (как я сделал), вам придется изменить файл на исполняемый с chmod 755 rc.localи добавить #!/bin/bashв первую строку.
Псита
77
Для 15.04 и позже:
Чтобы выполнить (недолговечную) команду 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
Вы можете запустить несколько команд из одного и того же служебного файла, используя несколько 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 '...'.
Можно ли установить приоритет на работу? или указать, что это зависит от другого сервиса, который будет запущен первым?
r3wt
1
@ r3wt да, есть разные способы сделать это. WantedByЗдесь используется, например, позволяет начать , когда multi-user.targetдостигается. Вы можете использовать Before, After, Requiresи т.д. Смman systemd.unit
Muru
@PerlDuck не единственное, чего не хватало. Спасибо!
Муру
Пожалуйста. - Между прочим, это RemainAfterExitзависит от того, какую службу вы запускаете и от какого поведения. Например, /bin/df -h<s> бы </ s> должен был иметь RemainAfterExit=no.
PerlDuck
@PerlDuck Ничто не присуще dfэтим потребностям RemainAfterExit=no. Если вы не хотите многократно выполнять команду при каждом запуске systemctl start foo.
Муру
71
Существуют разные способы автоматического запуска команд:
Система upstart выполнит все сценарии, из которых она найдет конфигурацию в каталоге /etc/init. Эти сценарии будут запускаться во время запуска системы (или в ответ на определенные события, например, запрос на выключение), и поэтому являются местом для запуска команд, которые не взаимодействуют с пользователем; все серверы запускаются с использованием этого механизма.
Сценарий оболочки, указанный .gnomercв вашем домашнем каталоге, автоматически создается при каждом входе в сеанс GNOME. Вы можете поместить произвольные команды там; Переменные окружения, которые вы установили в этом скрипте, будут видны любой программе, запущенной в вашем сеансе.
Обратите внимание, что сессия не начинается, пока .gnomercскрипт не завершится; следовательно, если вы хотите автоматически запустить какую-то долго работающую программу, вам нужно добавить &ее в вызов программы, чтобы отсоединить ее от работающей оболочки.
Пункт меню « Система» -> «Настройки» -> «Запуск приложений» позволяет определить, какие приложения следует запускать при запуске графического сеанса (Ubuntu предопределяет довольно много), а также добавлять или удалять их по своему вкусу. Это имеет почти то же самое назначение и область действия .gnomercсценария, за исключением того, что вам не нужно знать shсинтаксис (но вы также не можете использовать какую-либо shпрограммную конструкцию).
3) «Это имеет почти то же самое назначение и область действия сценария .gnomerc», за исключением того, что, .gnomercочевидно, запускается до загрузки Unity и, Startup Applicationsочевидно, запускается после загрузки Unity. Мне пришлось запустить программу, которая находится в строке меню Unity, и это имело огромное значение в этом случае!
Этот бразильский парень
1
@ ruda.almeida Спасибо за указание на это. Ответ был написан в дни до единства.
Риккардо Мурри
1
sudo update-rc.d myscript.sh defaultsгде /etc/init.d/myscript.sh - ваш скрипт, также запускает его при запуске.
Дан Даскалеску
27
$HOME/.config/autostart
Это местоположение содержит список запуска приложений.
.desktop Здесь можно поместить файл, который будет выполнен при запуске.
Пример примера для .desktopфайла:
Поместить следующий .desktopфайл в $HOME/.config/autostartи дано chmod +x:
Здесь "</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=
Следовательно, вы можете запустить желаемый сценарий оболочки при запуске!
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
Как выглядит скрипт?
Вот несколько сценариев, которые я настроил для запуска каждой загрузки:
Есть много разных способов добавить cronjobs, но суть ответа с высоким рейтингом и ваш ответ до сих пор @reboot.
Муру
Альтернативные методы для добавления crontabs должны быть опубликованы на askubuntu.com/q/2368/158442 , который явно о добавлении заданий Cron.
Муру
1
Позволю себе не согласиться. В основе рассматриваемого ответа используется то, crontab -eчто некоторые считают одним из черных искусств из-за vim-подобного интерфейса. С другой стороны, этот ответ может понравиться тем, чей мозг подключен определенным образом. Мы не все отлиты из одной и той же формы. С другой стороны, этот ответ уже имеет один отрицательный голос, поэтому мы позволим демократии пойти своим путем.
WinEunuuchs2Unix
2
Прошу вас. Мы оба знаем, что редактор можно заменить.
Муру
@muru Да, вероятно, потому что вы научили меня, а я научился менять редактор на что-то вроде nano или пару других CLI. Но я в лагере Гедит. Кроме того crontab -e, вспоминает звездочки ("*") на минуты, часы и т. Д., Которые я всегда находил, для которых мне нужны инструкции Google. Я все еще нахожу использование /etc/cron.dи /etc/cron.dailyмой выбор. Тем более, что это зеркала /etc/udev/rules.dи /etc/systemd/system-sleepметоды. Это просто кажется хорошей подгонкой.
WinEunuuchs2Unix
5
Вы должны использовать выскочку для этого. Upstart используется для процессов Ubuntu, которые запускаются автоматически. Это улучшенное решение, подобное старым сценариям System-V init.d. Это также позволяет вам поставить предварительные условия для запуска вашего скрипта (т.е. вам нужна работающая сеть? И т. Д.)
Ответы:
В зависимости от того, какие скрипты вам нужно запускать. Для сервисов и тому подобного вы должны использовать upstart . Но для пользовательского сценария они должны запускаться gnome как сценарии сеанса! Загляните в «Система»> «Настройки»> «Запуск приложений».
Кроме того, если вам нужно запустить некоторые скрипты при входе в систему с терминала, вы можете добавить их в файл .bash_login в вашем домашнем каталоге.
Для 14.04 и старше
Простая команда (которая не должна оставаться запущенной) может использовать задание Upstart, например:
Сохраните это в
.conf
файле/etc/init
(если вам нужно, чтобы он запускался от имени root при загрузке системы), или в~/.config/upstart
(если вам нужно, чтобы он работал от имени пользователя при входе в систему).источник
system->pref->startup applications
могут быть найдены/etc/init/
ни в, ни в~/.config/upstart
. Так, где определены приложения запуска?Одним из подходов является добавление задачи @reboot cron :
crontab -e
позволит вам редактировать свой хрон.Добавляем к нему такую строку:
выполнит этот скрипт после загрузки вашего компьютера.
источник
@reboot
Ключевое слово хороший наконечник , потому что это не так широко известны.man 5 crontab
говорит, что@reboot
выполняется при запуске (при запуске демона cron).rc.local
когда система кажется более настроенной к этому моменту (PATH и т. Д.). Странно, что так сложно что-то назвать после запуска системы ..Как насчет добавления команды в
/etc/rc.local
? вам придется использовать доступ sudo, хотя для редактирования этого файла.источник
chmod 755 rc.local
и добавить#!/bin/bash
в первую строку.Для 15.04 и позже:
Чтобы выполнить (недолговечную) команду 1 при запуске с помощью
systemd
, вы можете использовать системный блок типаOneShot
. Например, создать,/etc/systemd/system/foo.service
содержащий:Затем запустите:
По сути, это просто преобразование типичного задания Upstart в systemd (см. Systemd для пользователей Upstart ).
Вы можете запустить несколько команд из одного и того же служебного файла, используя несколько
ExecStart
строк:Команда всегда должна указываться с полным путем. Если какая-либо команда не выполняется, остальные не запускаются. Перед
-
тем, как путь указывает systemd игнорировать ненулевой статус выхода (вместо того, чтобы считать его неудачным).Актуальны:
man 5 systemd.service
Для пользовательских сессий вы можете
~/.config/systemd
вместо этого создать системный модуль . Это должно работать с 16.04 и выше, но не с более ранними выпусками Ubuntu с systemd (так как те все еще использовали Upstart для пользовательских сессий). Сеансами пользователя можно управлять с помощью тех же команд, что и с системными службами, но с--user
добавленной опцией:Синтаксис оболочки
Обратите внимание, что, в отличие от 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 - ваш скрипт, также запускает его при запуске..desktop
Здесь можно поместить файл, который будет выполнен при запуске.Пример примера для
.desktop
файла:Поместить следующий
.desktop
файл в$HOME/.config/autostart
и даноchmod +x
:Здесь
"</path/to/script>"
заменяется путь к вашемуscript.sh
(обычно рекомендуется
/usr/local/bin
так, что может быть выполнен непосредственно командой скажем,myscript
заменен на"</path/to/script>"
).Пример примера
script.sh
:Результат:
.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:
Стоит отметить, что вы
cron
можете отправить вам по электронной почте информацию о статусе выполненных и запущенных@reboot
заданий, так что ранний сетевой менеджер и электронная почта не будут работать, если вы не введетеsleep
команду в свои сценарии.Где поставить свои скрипты
Поместите ваши скрипты в каталог
/etc/cron.d
:Как выглядит скрипт?
Вот несколько сценариев, которые я настроил для запуска каждой загрузки:
источник
@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. Это также позволяет вам поставить предварительные условия для запуска вашего скрипта (т.е. вам нужна работающая сеть? И т. Д.)
источник