Заменить процесс экрана с экрана

Когда он запускается, я настроил exec screen оболочки на exec screen , если он уже не работает в сеансе экрана. Таким образом, в TTY дерево процессов будет выглядеть примерно так:

 login───screen───screen───zsh. 

Почти в каждом случае это то, что я хочу, но иногда мне хотелось бы запускать что-то без экрана, и я бы хотел сделать это, не меняя свою обычную настройку. Я ищу команду, которая заменяет самый верхний процесс экрана каким-либо другим, например оболочкой, например:

 login───bash, 

без необходимости выходить из системы и вносить временные изменения в мой .zshrc или использовать chsh .

  • Как добавить статус батареи в zsh в крайнем правом положении?
  • Как проще задавать задачи для пакета, используя инструмент префикса команд?
  • Проблема с zsh segfaulting: как продолжить оценку проблемы?
  • Удалите все, кроме одного (или более) типа файла
  • Как я могу правильно обрезать строку с помощью sed - и не убивать строку, если шаблон не существует?
  • Задания zsh и команды unznow bzr
  • Символы имени действительной функции Shell
  • История-поиск в zsh работает только для команд?
  • 2 Solutions collect form web for “Заменить процесс экрана с экрана”

    Вы можете запустить сеанс экрана в вас .zshrc без exec , просто screen . exec заменяет текущий процесс новым. Таким образом, вы никогда не вернетесь к исходному процессу, потому что его больше не существует.

    Если он был запущен без exec , pstree тогда будет выглядеть примерно так (я добавил -p в pstree, чтобы показать PID для понимания):

     |-login(857)---zsh(31597)---screen(1105)---screen(1108)---zsh(1109)-+-pstree(1209) $ echo $$ 1109 

    Теперь мы находимся в дочернем процессе screen , поэтому внутри screen . Когда вы теперь хотите что-то выполнить за пределами screen закройте screen или отсоедините его с помощью ctrla d . Снова pstree :

     |-screen(1108)---zsh(1109) |-login(857)---zsh(31597)-+-pstree(1481) $ echo $$ 31597 

    Первая строка – это отсоединенный screen с внутренней оболочкой, второй – текущей рабочей оболочкой (где мы сейчас). Как вы видите, переменная $$ содержит PID первого процесса zsh .

    Чтобы вернуться на экран, просто позвоните:

     screen -r 

    Теперь он выглядит так же, как в первом сценарии:

     |-screen(1108)---zsh(1109)-+-pstree(2118) |-login(857)---zsh(31597)---screen(2112) $ echo $$ 1109 

    Обратите внимание на PID: я вернулся в оболочку, которая является дочерним элементом screen (1108). Этот screen процесс (1108) больше не является дочерним процессом исходного экрана (1105), поскольку этот процесс больше не существует. Вот почему 1108 получил репарацию (его родитель теперь init с PID 1). В тот момент, когда я вызвал screen -r для повторного подключения назад, был создан новый экранный процесс с новым PID (2112). Эти screen говорят о простых сокетах unix или через именованные каналы друг с другом.

    Следующий метод может быть немного сложным, но может быть решением вашего вопроса.

    Вы можете создать дубликат пользователя, отредактировав файл / etc / passwd и дублировать строку своего пользователя. Измените имя пользователя (первое поле). Установите пароль для своего «нового» пользователя с помощью passwd newuser . Наконец, измените свой .zshrc и замените exec screen на проверку имени пользователя:

     if [ "`id -un`" != "newuser" ] then exec screen fi 

    Если вы хотите иметь сеанс без exec screen вы можете войти в систему с альтернативным пользователем, который на самом деле совпадает с вашим обычным пользователем.

    Возможно, есть лучшие альтернативы тому, чего вы пытаетесь достичь, но это может помочь вам …

    Linux и Unix - лучшая ОС в мире.