Я пытаюсь отсоединить процесс от сценария bash, чтобы SIGINT не переадресовывался процессу при выходе из сценария.
Я использовал disown
команду в терминале напрямую, однако в bash disown
не останавливает пересылку SIGINT. Цель этого скрипта - запустить openocd, а затем gdb за один вызов. Поскольку скрипт никогда не завершается (он запускает gdb), SIGINT по-прежнему пересылается из gdb в openocd, что является проблемой, поскольку SIGINT используется в качестве команды остановки в gdb.
В терминале это будет выглядеть примерно так:
$ openocd & # run openocd demonized
$ disown $! # disown last pid
$ gdb # invoke GDB
когда вызывается на терминале в этом порядке, SIGINT не передается из gdb в openocd. Однако, если этот же вызов был в скрипте bash, SIGINT передается.
Любая помощь будет принята с благодарностью.
ps эта проблема в OS X, но я пытаюсь использовать инструменты, которые также переносимы на все инструменты Unix.
nohup
не совсем правильный ответ. Вы должны добавить псевдокод или пример кода, чтобы показать более точно, что вы хотите.screen
?Ответы:
Чтобы отсоединить процесс от bash-скрипта:
Если вы остановите свой bash-скрипт
SIGINT
нажатием (ctrl + c) или оболочка прекратит отправку,SIGHUP
например, процесс не будет обеспокоен и продолжит нормальное выполнение.stdout
Иstderr
будет перенаправлен в файл журнала:nohup.out
.Если вы хотите выполнить отдельную команду, когда можете видеть вывод в терминале, используйте
tail
:источник
nohup
необходимо? В чем разница,nohup COMMAND &
иCOMMAND &
если ваша цель только запустить команду в фоновом режиме и освободить терминал?Для меня это прекрасно работает с отречением
источник
Решение, которое я нашел, включает в себя программу под названием «detach», написанную Анноном Инглорионом и загружаемую с его сайта.
После компиляции его можно использовать в сценарии следующим образом:
Эта первая строка создает новый процесс (работает openocd) и сохраняет идентификатор процесса в файле (debug.pid) для последующего использования. Это предотвращает проблемы с подстановкой для pid, как указано в ответе Оливера. При выходе из следующей программы блокировки (gdb) файл, в котором хранится pid, используется для непосредственного уничтожения отдельного процесса.
источник
detach
творит чудеса.простое и портативное решение:
Некоторые оговорки переносимости:
ps
варианты зависят от ОС! вы могли бы вместо того, чтобы использовать вариант:{ ps -ef || ps aux ;} | grep '[o]penocd | cut -f 1
.at
не может быть доступно (странно, но это случается ...).$(...)
нужна не очень старая оболочка, в противном случае используйте backticks.источник
at
запустите скрипт, который запускает программу и вместо этого выдает ее pid в файле, и заставьте главный скрипт ждать этого файл, чтобы появиться и затем прочитать pid из него.