xterm в ударе мешает сценарию выполниться

У меня есть следующий сценарий:

#!/bin/bash

xterm -e ' sh -c "$HOME/TEST/FirstAPP --test;" exec bash'
## script opens the xterm and stops until I press CTRL+C
while true; do
....

этот вопрос связан с этим вопросом

Почему сценарий останавливается в этом месте? Я должен был назвать xterm и выполнение и затем продолжить наличие кода выполнение FirstApp.

Я использовал терминал гнома без проблем.

1
задан 5 February 2019 в 19:13

1 ответ

Если Вы хотите, чтобы Ваш сценарий выполнил команду и затем продолжил выполняться, Вам нужна к бочке команда в фоновом режиме (&, см. https://unix.stackexchange.com/a/159514/22222). Так, измените свой сценарий на:

#!/bin/bash

xterm -e 'sh -c "$HOME/TEST/FirstAPP --test;"' &
## script opens the xterm and stops until I press CTRL+C
while true; do
....

Это запустится xterm управляйте в фоновом режиме, сохраняя терминал открытым и FirstAPP выполнение, и затем продолжится на другие строки Вашего сценария.

Причина это работало с gnome-terminal то, потому что, когда Вы работаете gnome-terminal, это, по-видимому, разветвляется само, и возвраты управляют к оболочке, от которой Вы запустили его. Вы видите это с strace:

$ strace -e clone gnome-terminal 
clone(child_stack=0x7fef6e44db30, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fef6e44e9d0, tls=0x7fef6e44e700, child_tidptr=0x7fef6e44e9d0) = 9534
clone(child_stack=0x7fef6dc4cb30, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fef6dc4d9d0, tls=0x7fef6dc4d700, child_tidptr=0x7fef6dc4d9d0) = 9535
# watch_fast: "/org/gnome/terminal/legacy/" (establishing: 0, active: 0)
clone(child_stack=0x7fef6d391b30, flags=CLONE_VM|CLONE_FS|CLONE_FILES|CLONE_SIGHAND|CLONE_THREAD|CLONE_SYSVSEM|CLONE_SETTLS|CLONE_PARENT_SETTID|CLONE_CHILD_CLEARTID, parent_tidptr=0x7fef6d3929d0, tls=0x7fef6d392700, child_tidptr=0x7fef6d3929d0) = 9540
# unwatch_fast: "/org/gnome/terminal/legacy/" (active: 0, establishing: 1)
# watch_established: "/org/gnome/terminal/legacy/" (establishing: 0)
+++ exited with 0 +++

Отметьте вызовы к clone который, как объяснено в man clone делает:

   clone() creates a new process, in a manner similar to fork(2).

Так, в отличие от большинства программ, gnome-terminal сделает клон из себя при запуске. Нормальный способ запустить что-то и затем продолжить что-то еще состоит в том, чтобы использовать & запустить его в фоновом режиме.

2
ответ дан 7 December 2019 в 13:18

Другие вопросы по тегам:

Похожие вопросы: