Я размещаю экспериментальный / тестирующий Linux-сервер, работающий под управлением Debian Wheezy 7.4.0. Разные пользователи входят в систему через ssh в свои учетные записи и могут запускать инструменты разработки и оставлять свои программы работающими как службы в фоновом режиме, если они того пожелают.
Поскольку это тестовая машина для всех видов целей, часто возникает необходимость перезапустить всю машину, а затем пользователям приходится снова входить в систему и перезапускать свои компоненты пользовательского пространства, которые работали. Я хотел бы это автоматизировать. По сути, я хотел бы предоставить пользователям средство для запуска материала сразу после загрузки машины (после того, как все остальное инициализировано) и средство для запуска материала при выключении системы (без ограничений по времени, в основном останавливая выключение до тех пор, пока все эти выключения пользовательские процессы завершены).
Что я пробовал до сих пор:
Я создал сценарий init bash, следуя принципам, содержащимся в файле шаблона 'скелет' в /etc/init.d/ (исходный код шаблона скелета: https://gist.github.com/ivankovacevic/9917139)
Мой код здесь: https://github.com/ivankovacevic/userspaceServices
Обычно сценарий просматривает домашние каталоги пользователей и ищет исполняемые файлы в соответствующих подкаталогах с именами .startUp, .shutDown или .status. В зависимости от текущего события сценарии выполняются с вс как будто пользователи сами их запустили.
Проблема, с которой я сейчас сталкиваюсь с этим подходом, заключается в том, что после загрузки системы остается зависший странный процесс, а сценарий запускает все процессы других пользователей. Вот как это выглядит в списке процессов:
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 3053 1 0 1024 620 1 17:42 ? 00:00:00 startpar -f -- userspaceServices
Я не знаю, что это за процесс, и на странице руководства для него не упоминается аргумент -f. Итак, я невежественен, но я, должно быть, делаю что-то не так, поскольку ни один другой сценарий / служба из init.d не оставляет такой процесс зависшим после загрузки.
Итак, я ищу кого-нибудь, кто поможет мне отладить это решение (которое, на мой взгляд, также кажется немного сложным). Или подскажите, как это можно реализовать совершенно по-другому.
ОБНОВИТЬ
Я начал отдельный вопрос для startpar выпуск: Процесс startpar зависает при запуске процессов из rc.local или init.d
ОБНОВЛЕНИЕ 2
Проблема решена для моего первоначального решения. Отметьте ранее упомянутый вопрос для startpar. Код на GitHub также исправлен, чтобы отразить это.
ОБНОВЛЕНИЕ 3 - Как использовать crontab
Как предложила Дженни, обычные пользователи могут планировать выполнение задач один раз при загрузке с помощью crontab. Я считаю, что это самый простой способ, если все, что вам нужно, - это запускать пользовательские задачи при загрузке, а не при завершении работы. Однако есть недостаток, заключающийся в том, что пользователи могут оставить процесс cron «зависшим» в качестве родительского при запуске текущих задач, похожих на службы. Сначала позвольте мне просто объяснить, как это работает:
Сами обычные пользователи должны звонить:
crontab -e
(-e как в редактировать ) Что открывает консольный текстовый редактор по умолчанию со своим пользовательским файлом crontab. Чтобы добавить задачу, которая будет выполняться при загрузке, пользователь должен добавить одну строку в конец файла:
@reboot /path/to/the/executable/file
Теперь, если бы пользователь сделал именно это, и если бы этот файл был не просто каким-то простым скриптом, который линейно что-то завершает и завершает, а своего рода сторожевым таймером, например, после перезагрузки вы закончите с чем-то вроде этого в своем списке процессов:
1 2661 root 20 0 20380 860 660 S 0.0 0.0 0:00.00 ├─ /usr/sbin/cron
2661 2701 root 20 0 33072 1152 868 S 0.0 0.0 0:00.00 │ └─ /USR/SBIN/CRON
2701 2944 someuser 20 0 4180 580 484 S 0.0 0.0 0:00.00 │ └─ /bin/sh -c ./watchdog
2944 2945 someuser 20 0 10752 1204 1016 S 0.0 0.0 0:00.00 │ └─ /bin/bash ./watchdog
2945 2946 someuser 20 0 23696 4460 2064 S 0.0 0.1 0:00.01 │ └─ /usr/bin/python ./some_program.py
Чтобы избежать этого, пользователю необходимо изменить свою запись crontab, чтобы она выглядела следующим образом:
@reboot /path/to/the/executable/file >/dev/null 2>&1 &
Перенаправление файловых дескрипторов необязательно, но рекомендуется поддерживать их в чистоте. Если вы хотите узнать почему, попробуйте взглянуть на них:
ls -l /proc/pid_of_started_process/fd
Я согласен с тем, что ваше решение кажется немного сложным, поэтому я скажу «дайте мне какое-нибудь представление, как это можно реализовать совершенно другим способом» :-)
Стандартным решением для этого является использование системы управления конфигурацией, такой как марионетка, и разрешение пользователям добавлять свои данные в конфигурацию марионетки для сервера. Затем Puppet вытолкнет стартовый сценарий и добавит их на соответствующие уровни запуска.
Более быстрый способ - предоставить им доступ sudoedit к /etc/rc.d/rc.local
и складывать туда свои вещи.
Или дайте каждому из них каталог для размещения стартовых скриптов, которые они хотят запустить, и попросите задание cron скопировать эти скрипты в /etc/init.d
, вставка su $USER -c
в подходящих местах и запустите на них chkconfig.
Или дайте им каталог для размещения стартовых скриптов и добавьте несколько строк в конце fo /etc/rc.d/rc.local
пройти по этим каталогам и запустить отредактировал su $USER -c 'script start'
по каждому скрипту в них.
Отредактировано для добавления: 5. Позвольте им использовать crontab для планирования выполнения заданий. @reboot