Як я можу від'єднати процес від скрипту bash?


18

Я намагаюся від'єднати процес від скрипту 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не зовсім правильна відповідь. Вам слід додати псевдокод або приклад коду, щоб точніше показати те, що ви хочете.
Брюс Едігер

1
Ви готові використовувати такий інструмент, як screen?
Ерік Реноф

Відповіді:


16

Щоб від'єднати процес від сценарію bash:

nohup ./process &

Якщо ви зупините ваш скрипт bash з SIGINT(ctrl + c), або оболонка закінчується надсиланням, SIGHUPнаприклад, процес не буде турбуватись і продовжуватиметься виконуватись нормально. stdoutІ stderrбуде перенаправлений в файл журналу: nohup.out.

Якщо ви хочете виконати відокремлену команду, маючи можливість бачити вихід у терміналі, тоді використовуйте tail:

TEMP_LOG_FILE=tmp.log
> "$TEMP_LOG_FILE"
nohup ./process &> "$TEMP_LOG_FILE" & tail -f "$TEMP_LOG_FILE" &

Чому не nohupпотрібні? У чому різниця nohup COMMAND &і COMMAND &якщо ваша мета полягає лише у виконанні команди у фоновому режимі та звільненні терміналу?
James Wierzba

@JamesWierzba Однією з відмінностей є те, що якщо вам потрібна команда продовжувати виконуватись навіть після виходу з оболонки, то нохуп - це шлях. В Інтернеті є тисячі широких пояснень. Наприклад stackoverflow.com/questions/15595374 / ...
Марк


4

Я знайшов рішення, що включає програму під назвою "відрив", написану Енноном Інглоріоном та яку можна завантажити з його веб-сайту

Після компіляції його можна використовувати в сценарії так:

$ ./detach -p debug.pid openocd <args> # detach openocd
$ gdb <args>                           # run gdb
$ kill -9 $(cat debug.pid)             # end openocd process
$ rm debug.pid                         # remove file containing process id

Цей перший рядок створює новий процес (працює з openocd) і зберігає ідентифікатор процесу у файлі (debug.pid) для подальшого використання. Це запобігає проблемам із прив’язкою до піда, як це передбачено у відповіді Олівера. Після виходу з наступної програми блокування (gdb) файл, що зберігає pid, використовується для безпосереднього знищення відірваного процесу.


Може підтвердити, detachтворить чудеса.
AS

2

просте і портативне рішення:

echo "openocd" | at now #openocd starts now, but via the at daemon, not the current shell!
pid=$(ps -ef | grep "[o]penocd" | awk '{print $1}')  
echo "openocd is running with pid: $pid"
gdb

Деякі застереження щодо переносимості: psпараметри залежать від ОС! ви могли б замість того, щоб використовувати варіант: { ps -ef || ps aux ;} | grep '[o]penocd | cut -f 1. atне міг бути доступним (дивно, але це буває ...). $(...)потрібна не справді стара оболонка, інакше використовуйте backticks.


Це здається небезпечним, прив'язка до pid може робити несподівані речі, якщо більше одного процесу працює з тим самим іменем, або навіть, якщо інший процес містить слово openocd.
Оріон

1
@orion: я даю простий приклад, щоб дати ідеї, тих проблем, які ви згадуєте, легко позбутися: atзапустіть скрипт, який запускає програму і видає свій pid замість файлу, і основний скрипт чекає цього файл, який з’явиться, а потім прочитайте його.
Олів'є Дулак

звичайно, ви повинні замінити в моєму (надто простому) прикладі grep тестом всередині awk, у правій колонці (зазвичай 8 доларів) (стовпці залежать від вашого ОС та версії / варіантів PS)
Олів'є Дулак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.