Я знаю, что когда-то знал, как это сделать, но ... как запустить скрипт (bash в порядке) при входе в систему в Unix?
Как запустить скрипт при входе в *nix?
- Какой логин? Вход в пользовательский интерфейс? как гном, GTK, Unity? Возможно, новый вход в оболочку с tty? В чем разница между ними? 16.07.2012
Ответы:
Когда Bash запускается, он выполняет команды в различных скриптах.
Когда Bash вызывается как интерактивная оболочка входа в систему, он сначала читает и выполняет команды из файла /etc/profile, если этот файл существует. После прочтения этого файла он ищет ~/.bash_profile, ~/.bash_login и ~/.profile в указанном порядке, а также читает и выполняет команды из первого существующего и доступного для чтения файла.
При выходе из оболочки входа Bash читает и выполняет команды из файла ~/.bash_logout, если он существует.
Когда запускается интерактивная оболочка, которая не является оболочкой входа в систему, Bash читает и выполняет команды из ~/.bashrc, если этот файл существует. Это можно запретить с помощью параметра --norc. Параметр файла --rcfile заставит Bash читать и выполнять команды из файла вместо ~/.bashrc.
При входе в систему большинство оболочек выполняют сценарий входа в систему, который вы можете использовать для выполнения своего пользовательского сценария. Сценарий входа в систему, выполняемый оболочкой, конечно же, зависит от оболочки:
- bash: .bash_profile, .bash_login, .profile (для обратной совместимости)
- ш: .профиль
- tcsh и csh: .логин
- зш: .zshrc
Вероятно, вы можете узнать, какую оболочку вы используете, выполнив
echo $SHELL
из подсказки.
Для немного более широкого определения «входа в систему» полезно знать, что в большинстве дистрибутивов при запуске X ваш .xsessionrc будет выполняться при запуске вашей X-сессии.
При использовании Bash первый из ~/.bash_profile
, ~/.bash_login
и ~/.profile
будет запущен для интерактивной оболочки входа в систему. Я считаю, что ~/.profile
обычно запускается оболочками Unix, помимо Bash. Bash запустит ~/.bashrc
для интерактивной оболочки без входа в систему.
Обычно я помещаю все, что я хочу всегда устанавливать, в .bashrc
, а затем запускаю его из .bash_profile
, где я также устанавливаю несколько вещей, которые должны выполняться только при входе в систему, например, настройка ssh-agent
или запуск screen
.
Если вы хотите запустить один скрипт и только один скрипт, вы можете сделать его оболочкой пользователя по умолчанию.
echo "/usr/bin/uptime" >> /etc/shells
vim /etc/passwd
* username:x:uid:grp:message:homedir:/usr/bin/uptime
может иметь интересные эффекты :) (хотя это небезопасно, так что не слишком доверяйте этому. Нет ничего лучше, чем настроить оболочку по умолчанию как сценарий, который стирает ваш диск. ... хотя, .. Я могу представить сценарий, в котором это может быть невероятно полезным)
Если вы используете OSX, то это ~/.profile
Launchd
является предпочтительным способом в OS X.
Если вы хотите, чтобы он запускался при вашем входе в систему, поместите его в ~/Library/LaunchAgents
Начать launchd
элемент
launchctl load /Library/LaunchDaemons/com.bob.plist
Остановить элемент
launchctl unload /Library/LaunchDaemons/com.bob.plist
Пример com.bob.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.bob</string>
<key>RunAtLoad</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/java</string>
<string>-jar</string>
<string>/Users/user/program.jar</string>
</array>
</dict>
</plist>
Я был разочарован этой проблемой в течение нескольких дней. На убунте ничего не работало. Если я поместил вызов в /etc/profile, все рухнуло при попытке входа в систему. Я не мог использовать «Приложения для запуска», так как это было не то, что я хотел. Это только устанавливает сценарий для этого текущего пользователя.
Наконец я нашел эту небольшую статью: http://standards.freedesktop.org/autostart-spec/autostart-spec-0.5.html
Решение будет:
узнать путь $XDG_CONFIG_DIRS:
эхо $XDG_CONFIG_DIRS
поместите свой скрипт в этот каталог
Добавьте запись в /etc/profile
, которая выполняет скрипт. Это будет выполняться при каждом входе в систему. Если вы делаете это только для своей учетной записи, используйте один из ваших сценариев входа (например, .bash_profile
) для его запуска.
Найдите ^INVOCATION на странице руководства bash вашей локальной системы для получения информации о том, какой файл будет прочитан при запуске.
man bash
/^INVOCATION
Также в разделе ФАЙЛЫ
~/.bash_profile
The personal initialization file, executed for login shells
~/.bashrc
The individual per-interactive-shell startup file
Добавьте свой скрипт в соответствующий файл. Убедитесь, что скрипт находится в $PATH, или используйте абсолютный путь к файлу скрипта.
Скрипт ~/.bash_profile
запускается при входе в систему.