Usiłuję odłączyć proces od skryptu bash, aby SIGINT nie był przekazywany do procesu po zamknięciu skryptu.
Użyłem disown
polecenia bezpośrednio w terminalu, jednak w bash disown
nie powstrzymuje SIGINT od przekazania. Celem tego skryptu jest uruchomienie openocd, a następnie gdb za pomocą pojedynczego wywołania. Ponieważ skrypt nigdy się nie kończy (działa z gdb), SIGINT jest nadal przekazywany z gdb do openocd, co stanowi problem, ponieważ SIGINT jest używany jako polecenie zatrzymania w gdb.
W terminalu wyglądałoby to mniej więcej tak:
$ openocd & # run openocd demonized
$ disown $! # disown last pid
$ gdb # invoke GDB
wywołany na terminalu w tej kolejności, SIGINT nie jest przekazywany z gdb do openocd. Jednak jeśli to samo wywołanie było w skrypcie bash, SIGINT jest przekazywany.
Każda pomoc byłaby bardzo mile widziana.
ps ten problem występuje w OS X, ale próbuję użyć narzędzi, które są również przenośne dla wszystkich narzędzi Uniksa.
nohup
nie jest właściwą odpowiedzią. Powinieneś dodać pseudokod lub przykładowy kod, aby dokładniej pokazać, czego chcesz.screen
?Odpowiedzi:
Aby odłączyć proces od skryptu bash:
Jeśli zatrzymasz skrypt bash za pomocą
SIGINT
(ctrl + c) lub powłoka zakończy wysyłanie,SIGHUP
na przykład, proces nie będzie przeszkadzał i będzie kontynuował normalne działanie.stdout
Istderr
zostanie przekierowany do pliku dziennika:nohup.out
.Jeśli chcesz wykonać odłączoną komendę, jednocześnie widząc dane wyjściowe w terminalu, użyj
tail
:źródło
nohup
konieczne? Jaka jest różnica między,nohup COMMAND &
aCOMMAND &
jeśli Twoim celem jest uruchomienie polecenia w tle i zwolnienie terminala?Dla mnie to działa idealnie z disown
źródło
Znalezione przeze mnie rozwiązanie obejmuje program o nazwie „odłącz” napisany przez Annona Ingloriona i dostępny do pobrania z jego strony internetowej
Po skompilowaniu można go użyć w skrypcie w następujący sposób:
Ten pierwszy wiersz tworzy nowy proces (z uruchomionym openocd) i przechowuje identyfikator procesu w pliku (debug.pid) do późniejszego wykorzystania. Zapobiega to problemom z grepowaniem dla pid zgodnie z odpowiedzią Olivera. Po wyjściu z następnego programu blokującego (gdb) plik przechowujący pid służy do bezpośredniego zabicia odłączonego procesu.
źródło
detach
czyni cuda.proste i przenośne rozwiązanie:
Niektóre zastrzeżenia dotyczące przenośności:
ps
opcje zależą od systemu operacyjnego! można zamiast tego użyć wariant:{ ps -ef || ps aux ;} | grep '[o]penocd | cut -f 1
.at
nie może być dostępny (dziwne, ale tak się dzieje ...).$(...)
potrzebuje naprawdę starej powłoki, w przeciwnym razie użyj backicks.źródło
at
uruchom skrypt, który uruchamia program i zamiast tego podaje swój pid w pliku, a skrypt główny czeka na to pojawi się plik, a następnie przeczytaj z niego pid.