Как сохранить Bash, бегущий за выполнением команды?

Это кажется, что Вы проходите проверку подлинности с Active Directory. Когда Вы перемещаетесь в свою домашнюю сеть, Ваш AD контроллер не присутствует так, Samba не знает, что сделать.

Почему делает это, все еще дает то сообщение, когда Вы возвращаетесь к работе? Никакая идея, но мое предположение не существует кэш где-нибудь, который должен быть сброшен.

Быстрый поиск DuckDuckGo сбрасывания winbind кэша самбы здесь.

Я удостоверился бы, что сделал резервное копирование перед рукой.

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

29
13.04.2017, 15:37
7 ответов
( exec sh -i 3<<SCRIPT 4<&0 <&3                                        ⏎
    echo "do this thing"
    echo "do that thing"
  exec  3>&- <&4
  SCRIPT
)

Это лучше сделать из сценария, но с помощью exec $ 0. Или, если один из этих файловых дескрипторов направляет на терминальное устройство, которое в настоящее время не используется, это поможет - вы должны помнить, что другие процессы тоже хотят проверить этот терминал.

И, кстати, если ваша цель, как я предполагаю, состоит в том, чтобы сохранить среду сценария после его выполнения, вам, вероятно, будет намного лучше работать с:

. ./script

.dot [оболочки] оболочки и исходный код bash не одно и то же - .dot оболочки - это POSIX, указанный как специальная встроенная оболочка, и поэтому он настолько близок к гарантированному, насколько это возможно, хотя это ни в коем случае не гарантия, что он будет там ...

Хотя вышеперечисленное должно работать так, как вы ожидаете, без особых проблем. Например, вы можете:

 ( exec sh -i 3<<SCRIPT 4<&0 <&3                                        ⏎
    echo "do this thing"
    echo "do that thing"
    $(cat /path/to/script)
    exec  3>&- <&4
    SCRIPT
 )

Оболочка запустит ваш скрипт и вернет вас к интерактивной подсказке - пока вы избегаете exit в оболочке из вашего скрипта, т.е. который свяжет ваш ввод-вывод с / dev / null.

ДЕМО:

% printf 'echo "%s"\n' "These lines will print out as echo" \
    "statements run from my interactive shell." \
    "This will occur before I'm given the prompt." >|/tmp/script
% ( exec sh -i 3<<SCRIPT 4<&0 <&3
    echo "do this thing"
    echo "do that thing"
    $(cat /tmp/script)
    exec  3>&- <&4
SCRIPT
)
sh-4.3$ echo "do this thing"
    do this thing
sh-4.3$ echo "do that thing"
    do that thing
sh-4.3$ echo "These lines will print out as echo"
    These lines will print out as echo
sh-4.3$ echo "statements run from my interactive shell."
    statements run from my interactive shell.
sh-4.3$ echo "This will occur before I'm given the prompt."
    This will occur before I'm given the prompt.
sh-4.3$ exec  3>&- <&4
sh-4.3$

МНОГО ЗАДАНИЙ

Я считаю, что вам следует поближе познакомиться со встроенными в оболочку параметрами управления задачами.@Kiwy и @jillagre уже затронули этот вопрос в своих ответах, но это может потребовать дополнительных подробностей. И я уже упоминал одну встроенную специальную оболочку, указанную в POSIX, но set, jobs, fg, и bg - это еще несколько, и, как показывает другой ответ, ] trap и kill - еще два.

Если вы еще не получаете мгновенных уведомлений о состоянии одновременно запущенных фоновых процессов, это связано с тем, что для ваших текущих параметров оболочки установлено значение по умолчанию, указанное в POSIX -m , но вы можете получить их асинхронно с вместо этого установите -b :

% man set
  -b Эта опция должна поддерживаться, если реализация поддерживает опцию User Portability Utilities 
. Это должно заставить оболочку 
асинхронно уведомлять пользователя о завершении фоновых заданий. Следующее сообщение 
записывается в стандартную ошибку: 
 
             "[%d]%c %s%s\n", <job-number>, <current>, <status>, <job-name>

         where the fields shall be as follows:

         <current> The  character  '+' identifies the job that would be
                     used as a default for the fg or  bg  utilities;  this
                     job  can  also  be specified using the job_id "%+" or
                     "%%".  The character  '−'  identifies  the  job  that
                     would  become  the default if the current default job
                     were to exit; this job can also  be  specified  using
                     the  job_id  "%−".   For  other jobs, this field is a
                     <space>.  At most one job can be identified with  '+'
                     and  at  most one job can be identified with '−'.  If
                     there is any suspended  job,  then  the  current  job
                     shall  be  a suspended job. If there are at least two
                     suspended jobs, then the previous job also shall be a
  -m Эта опция должна поддерживаться, если реализация поддерживает параметр 
User Portability Utilities. Все задания должны выполняться в своих 
группах процессов. Непосредственно перед тем, как оболочка выдаст приглашение 
после завершения фонового задания, сообщение о статусе выхода 
фонового задания должно быть записано в стандартную ошибку 
. Если задание переднего плана останавливается, оболочка должна написать для этого сообщение 
в стандартную ошибку, отформатированную, как описано утилитой заданий 
.Кроме того, если задание меняет статус, отличный от 
выхода (например, если оно останавливается для ввода или вывода или 
остановлено сигналом SIGSTOP), оболочка должна написать аналогичное {{1} }} сообщение непосредственно перед написанием следующего приглашения. Эта опция 
включена по умолчанию для интерактивных оболочек. 
 

Очень фундаментальной особенностью систем на основе Unix является их метод обработки сигналов процесса . Однажды я прочитал поучительную статью на эту тему, в которой этот процесс сравнивается с описанием планеты Дугласом Адамсом NowWhat:

"В" Автостопом по галактике "Дуглас Адамс упоминает {{ 1}} чрезвычайно унылая планета, населенная кучкой депрессивных людей и определенной породы животных с острыми зубами, которые общаются с людьми, очень сильно кусая их за бедра. Это поразительно аналогично UNIX, в котором ядро ​​взаимодействует с процессами, посылая им парализующие или смертельные сигналы. Процессы могут перехватывать некоторые из сигналов и пытаться адаптироваться к ситуации , но большинство из них этого не делают ".

Это относится к сигналам уничтожения .

% kill -l 
> HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL PWR SYS

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

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

В зависимости от конфигурации вашего терминала (которую можно проверить с помощью stty -a ) , CTRL + Z , скорее всего, будет пересылать SIGTSTP текущему лидеру группы процессов переднего плана, который, вероятно, является вашей оболочкой,и который также должен быть настроен по умолчанию на перехват этого сигнала и приостановку вашей последней команды. Опять же, как показывают совместные ответы @jillagre и @Kiwy, вам ничто не мешает адаптировать эту функциональность к вашим целям по своему усмотрению.

ЭКРАННЫЕ ЗАДАНИЯ

Итак, чтобы воспользоваться этими функциями, ожидается, что вы сначала поймете их и настроите их обработку в соответствии со своими потребностями. Например, я только что нашел этот screenrc на Github , который включает screen привязки клавиш для SIGTSTP :

# hitting 'C-z C-z' will run Ctrl+Z (SIGTSTP, suspend as usual)
bind ^Z stuff ^Z

# hitting 'C-z z' will suspend the screen client
bind z suspend

Это упростило бы задачу приостановить процесс, выполняющийся как дочерний процесс screen или сам дочерний процесс screen , по вашему желанию.

И сразу после этого:

% fg  

ИЛИ:

% bg

Будет ли процесс на переднем плане или в фоновом режиме по вашему усмотрению. Встроенные задания могут предоставить вам их список в любое время. Добавление операнда -l будет включать сведения о pid.

8
27.01.2020, 19:38
[1120188]Вот более короткое решение, которое выполнит то, что вы хотите, но может не иметь смысла, если вы не поймете проблему и как работает bash:[12195]Это запустит оболочку bash, запустит [1120739]some_program[1120740], и после выхода [1120741]some_program[1120742], вы будете сброшены в оболочку bash. [12196] В основном, мы подаем бэш-строку на STDIN. Эта строка является [1120743]some_program с ее аргументами; exec
23
27.01.2020, 19:38

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

bash -c "some_program with its arguments; bash"

Это запустит интерактивный bash после запуска программы.

0
27.01.2020, 19:38

Вы можете использовать screen для выполнения команды. Затем вы можете повторно подключиться к сеансу после завершения команды.

Или просто запустите команду в фоновом режиме some_program с ее аргументами & . Это даст вам возможность повторно запустить команду и получить статус команды, как только она будет выполнена.

0
27.01.2020, 19:38

Это должно помочь:

bash -c "some_program with its arguments;bash"

Изменить:

Вот новая попытка после вашего обновления:

bash -c "
trap 'select wtd in bash restart exit; do [ \$wtd = restart ] && break || \$wtd ; done' 2
while true; do
    some_program with its arguments
done
"
  • Мне нужно завершить some_program из время от времени

Используйте Control C , вам будет представлено это небольшое меню:

1) bash
2) restart
3) exit
  • Я не хочу помещать его на задний план

Это так.

  • Я хочу остаться на bash, а затем заняться чем-нибудь еще

Выберите вариант «bash»

  • Я хочу снова запустить программу

Выберите вариант «перезапустить»

{ {1}}
8
27.01.2020, 19:38

Вы можете поместить команду в фон, чтобы сохранить текущий bash открытым:

some_program with its arguments &

Чтобы вернуться к запуску, вы можете использовать команду fg и ^+z, чтобы снова поместить ее в фон

0
27.01.2020, 19:38

Вы можете сделать это, передав свой скрипт в качестве файла инициализации:

bash --init-file foo.script

Или вы можете передать его в командной строке:

bash --init-file <(echo "ls -al")

Обратите внимание, что --init-fileпредназначен для чтения общесистемных файлов инициализации, таких как /etc/bash.bashrc, так что вы можете захотеть ' source' их в своем скрипте.

4
27.01.2020, 19:38

Теги

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