
Ubuntu 14.04.5 LTS
Желаемая функциональность: Удаленный сервер Ubuntu загружается и автоматически запускает текущий процесс как указанный пользователь. Затем я могу войти удаленно позже и просмотреть прошлые и текущие выходные данные текущего процесса.
Текущий план:
Автоматизированные шаги:
Пользователь «ubuntu» автоматически входит в терминал (TTY) при загрузке:
"sudo nano /etc/init/tty1.conf" Change: exec /sbin/getty -8 38400 tty1 To: exec /sbin/getty --autologin ubuntu -8 38400 tty1
Пользователь «ubuntu» запускает GNU screen:
screen -d -m -S screenname
Пользователь «ubuntu» запускает текущий процесс в GNU screen:
screen -S screenname -p 0 -X stuff "command^M"
Ручные действия, выполняемые позднее:
- Я вхожу в систему удаленно как пользователь «ubuntu» в другом терминале (TTY).
Я повторно подключаюсь к сеансу GNU screen, начатому на шаге 2:
screen -r
- Я могу просматривать прошлые и текущие результаты процесса, начатого на шаге 3.
Вопросы:
- Является ли это наиболее эффективным способом достижения желаемого результата?
- Как можно автоматизировать команды на шагах 2 и 3?
- Как команды в шаге 2 и 3 могутнетактивировать, когда я вхожу вручную на шаге 4?
решение1
Ответы(на мои собственные вопросы)
- Является ли это наиболее эффективным способом достижения желаемого результата?
Я все еще не уверен, являются ли приведенные ниже решения наиболее эффективными, но могу подтвердить, что они, по крайней мере, работают на указанной версии Ubuntu. - Как можно автоматизировать команды на шагах 2 и 3?
Почему команды на шаге 2 и 3 не активируются, когда я вхожу в систему вручную на шаге 4?
Первый шаг
Я поместил следующее в конец файла .profile в каталоге пользователя, который автоматически вошел в систему на шаге 1 выше (/home/ubuntu/.profile):pgrep processname || /home/ubuntu/processscript.sh
Когда пользователь автоматически войдет в систему, эта команда выполнится автоматически, поскольку она находится в .profile. Первая часть команды (до "||" проверяет, запущен ли уже 'processname'. Если нет, она выполнит вторую часть команды (после "||"), т. е. "processscript.sh" ... Если 'processname' уже запущен, то он не будет запущен.
Эта проверка была необходима, поскольку процесс, который я хотел запустить, не мог иметь несколько запущенных экземпляров одновременно. Кроме того, она решает проблему запуска процесса во второй раз, когда я позже войду в систему вручную.
Шаг второй
Создайте файл сценария оболочки с именем «processscript.sh» со следующим содержимым:#!/bin/bash screen -d -m -S screenname && screen -S screenname -p 0 -X stuff "/home/ubuntu/command.sh^M"
Убедитесь, что «processscript.sh» находится в каталоге /home/ubuntu и что его можно выполнить с помощью команды:
chmod 744 processscript.sh
Приведенный выше скрипт оболочки создает экземпляр экрана с именем «screenname» и, в случае успешного завершения, заполняет командную строку этого экземпляра экрана командой «command.sh» с возвратом каретки (именно это и делает «^M» в конце).
Шаг третий
На предыдущем этапе я столкнулся с некоторыми проблемами при заполнении команды атрибутами в командной строке экрана (я думаю, что требовалось экранирование символов). Чтобы решить эту проблему просто, я добавил полную команду с атрибутами в скрипт оболочки и использовал его вместо этого. Поэтому создайте еще один скрипт оболочки (как выше) с именем "command.sh" и добавьте туда полную команду.