Насколько я понимаю, ваши требования заключаются в том, чтобы иметь возможность:
Если придерживаться подхода &
, то да, есть сокращение для (3 ). Когда программа контролирует терминал, ее можно перевести в фоновый режим с помощью сигнала SIGTSTP
. Достаточно удобно, что обычно это делает Ctrl + Z .
Следовательно, у вас может быть что-то вроде этого:
$ foo &
Welcome
[1] 10
$ foo &
Welcome
[2] 11
$ fg %1
Time now is 01:23:45
[1]+ Stopped
Насколько мне известно, дляfg
(такого ярлыка нет, и как бы вы все равно указали, какой экземпляр вернуть?)
Обратите внимание, что сигнал SIGTSTP
на самом деле не обязательно должен исходить от оболочки, которая запустила процесс. Если вы kill -TSTP
запустите процесс по PID во второй оболочке, вы также сможете вернуть его с помощью fg
в первой.
I need to put it back to background after obtaining the latest output of the program (by pressing any button: is there any method to do this programmatically?)
Если под программно вы подразумеваете, что у вас есть доступ к исходному коду foo
, тогда вы можете использовать то, что мы только что видели. Системный вызов raise
может использоваться программой для отправки сигнала самой себе. Если мы возьмем очень упрощенную версию foo
, у нас может быть что-то вроде этого:
#include
#include
int main(void)
{
printf("Welcome");
while(getchar()) { /* Use termios to switch to unbuffered mode */
fprintf(stdout, "The time is... something");
fflush(stdout);
fflush(stdin);
raise(SIGTSTP);
}
return 0;
}
Теперь, хотя все это достаточно хорошо, я согласен, что screen
, вероятно, лучший способ сделать все это, в основном потому, что вы можете называть свои сеансы экрана и, следовательно, никогда не нужно запоминать идентификатор задания или процесса. Как и подход &
, он также имеет то преимущество, что не требует внесения изменений в исходный код.
$ screen -S foo1
$./foo
Welcome
[detached from 10.foo1]
$ screen -s foo1
Time now is 01:23:45
[detached from 10.foo1]
Еще одно преимущество заключается в том, что вам не нужно останавливать программу перед отсоединением. Это довольно удобно, если вы хотите, чтобы он делал что-то в фоновом режиме, пока вы не смотрите. В предыдущем подходе вам нужно было бы запускать bg
каждый раз, когда вы останавливаете foo
.
Вы также можете получить список запущенных экранов с помощью screen -ls
. На моей машине я установил несколько псевдонимов в ~/.bashrc
, чтобы учесть мою дополнительную лень :
.
alias S='screen -S'
alias s='screen -r'
alias sls='screen -ls'
Таким образом, вы могли бы просто делать такие вещи, как S foo1
, s foo1
,... Некоторые могут возразить, что псевдонимы одного символа -могут немного раздражать, когда вы неправильно ставите пробел или что-то в своих командах, но я думаю screen
является одной из тех программ, которые настолько удобны , что вы можете позволить себе сделать исключение.
Теперь, предположив, что вы используете screen
подход, вот как вы можете отправить ключ в сеанс и получить его последнюю строку вывода из оболочки. Есть способы настроить это (, и я позволил себе несколько сокращений ), но тем не менее. Вы можете определить следующую функцию в~/.bashrc
:
screen_key_tail() {
screen -S $1 -X stuff "^M"
tmp="$(mktemp)"
screen -S $1 -X hardcopy "$tmp"
grep -v ^$ "$tmp" | tail -n1
rm "$tmp"
}
и вызовите его с помощью:
$ screen_key_tail foo1
, где foo1
— имя сеанса screen
, на который вы ориентируетесь.
Если вам нужен более подробный ответ, лучше всего сравнить конфигурацию двух ядер.
Для x86 _64, например, вы можете скачать эти два файла конфигурации :https://git.alpinelinux.org/aports/plain/main/linux-lts/config-lts.x86_64https://git.alpinelinux.org/aports/plain/main/linux-lts/config-virt.x86_64
Это, соответственно, долговременная поддержка версии ядра lts (, которая включена в стандарт Alpine ), и virt (, включенная в виртуальный вариант ). На момент написания статьи версия ядра — 5.4.61 (edge version [1] ).
Как только вы поняли разницу, вы можете проверить, что должен делать каждый вариант. В StackOverflow есть старый вопрос, в котором объясняется, как получить параметры ядра и соответствующее объяснение каждого параметра :https://stackoverflow.com/questions/46574447/how-do-i-find-linux-config-options-in-menuconfig
.Надеюсь, это поможет.
. :Франческо
Я предполагаю, что секцию драйверов ядра можно уменьшить, потому что она ориентирована на работу на виртуальном оборудовании, а не на всевозможных реальных аппаратных средствах.
Он «похудел» за счет того, что -стал легче, а «оптимизирован для виртуальных систем» означает, что он будет лучше работать в виртуальных системах.