Mam długo działającą bash
instancję (wewnątrz screen
sesji), która wykonuje złożony zestaw poleceń w pętli (każda pętla wykonuje potoki, przekierowania itp.).
Długa linia poleceń została napisana wewnątrz terminala - nie ma jej w żadnym skrypcie. Teraz znam identyfikator procesu bash i mam dostęp do konta root - jak mogę zobaczyć, jaki dokładnie wiersz poleceń jest w nim wykonywany bash
?
bash$ echo $$
1234
bash$ while true ; do \
someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done
W innej instancji powłoki chcę zobaczyć, jak wiersz poleceń jest wykonywany w PID 1234:
bash$ echo $$
5678
bash$ su -
sh# cd /proc/1234
sh# # Do something here that will display the string \
'while true ; do someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done'
czy to możliwe?
EDYCJA 1
Dodanie kontrprzykładów dla niektórych odpowiedzi, które mam.
O korzystaniu z
cmdline
under/proc/PID
: to nie działa, przynajmniej nie w moim scenariuszu. Oto prosty przykład:$ echo $$ 8909 $ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
W innej powłoce:
$ cat /proc/8909/cmdline bash
Korzystanie
ps -p PID --noheaders -o cmd
jest tak samo bezużyteczne:$ ps -p 8909 --no-headers -o cmd bash
ps -eaf
nie jest również pomocne:$ ps -eaf | grep 8909 ttsiod 8909 8905 0 10:09 pts/0 00:00:00 bash ttsiod 30697 8909 0 10:22 pts/0 00:00:00 sleep 30 ttsiod 31292 13928 0 10:23 pts/12 00:00:00 grep --color=auto 8909
Oznacza to, że nie ma danych wyjściowych z wiersza polecenia ORIGINAL, czego właśnie szukam - tj
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
.
gdb
:print (char *)rl_line_buffer
. Bieżące polecenie w sekwencji toprint (char *)the_printed_command
. Możesz równieżcall history_builtin()
, ale to wyświetli się w tty procesu bash, więc może być mniej przydatne.Ponieważ polecenie nadal działa na ekranie, jego nadrzędny bash nie odczytał żadnej historii, więc:
^Z
wtedyup arrow
^A^A
- ponieważ screen (1) - i^E
) i echo + przekierowanie do plikufg
w celu wykonania poleceniaIstnieją zastrzeżenia, ale jest to przydatne w większości przypadków.
źródło
up
. Chociaż musisz mieć pewność, że uruchomi się ponownie bez żadnego problemu, ale jeśli nie, to i tak będziesz mieć ten sam problem po ponownym uruchomieniu. Musisz tylko wybrać moment, w którym przestój nie będzie problemem.Wiem, że znalazłeś własną odpowiedź, ale jest powód, dla którego nie możesz zrobić czegoś takiego:
Być może nie można łączyć wyników rzeczywistego zadania z danymi wyjściowymi bash pokazującymi aktualnie wykonywaną linię.
Również FWIW, jeśli wolisz, gadatliwość,
set -o xtrace
.źródło