tts*_*ras 34 bash process debugging
我有一个长时间运行的bash实例(在screen会话内),它在循环内执行一组复杂的命令(每个循环执行管道、重定向等)。
长命令行写在终端内 - 它不在任何脚本内。现在,我知道 bash 进程 ID,并且我有 root 访问权限 - 我怎样才能看到在其中执行的确切命令行bash?
bash$ echo $$
1234
bash$ while true ; do \
someThing | somethingElse 2>/foo/bar | \
yetAnother ; sleep 600 ; done
Run Code Online (Sandbox Code Playgroud)
在另一个 shell 实例中,我想查看在 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'
Run Code Online (Sandbox Code Playgroud)
这可能吗?
为我得到的一些答案添加反例。
关于使用cmdlineunder /proc/PID: 这行不通,至少在我的情况下不行。这是一个简单的例子:
$ echo $$
8909
$ while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
Run Code Online (Sandbox Code Playgroud)
在另一个外壳中:
$ cat /proc/8909/cmdline
bash
Run Code Online (Sandbox Code Playgroud)使用ps -p PID --noheaders -o cmd同样没用:
$ ps -p 8909 --no-headers -o cmd
bash
Run Code Online (Sandbox Code Playgroud)ps -eaf 也没有帮助:
$ 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
Run Code Online (Sandbox Code Playgroud)
也就是说,原始命令行没有输出,这就是我正在寻找的 - 即while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done.
tts*_*ras 48
我知道我在抓着救命稻草,但 UNIX 永远不会失败!
这是我的管理方式:
bash$ gdb --pid 8909
...
Loaded symbols for /lib/i386-linux-gnu/i686/cmov/libnss_files.so.2
0xb76e7424 in __kernel_vsyscall ()
Run Code Online (Sandbox Code Playgroud)
然后在(gdb)提示符下我运行了命令,call write_history("/tmp/foo")它将将此历史记录写入文件/tmp/foo.
(gdb) call write_history("/tmp/foo")
$1 = 0
Run Code Online (Sandbox Code Playgroud)
然后我脱离了这个过程。
(gdb) detach
Detaching from program: /bin/bash, process 8909
Run Code Online (Sandbox Code Playgroud)
并退出gdb。
(gdb) q
Run Code Online (Sandbox Code Playgroud)
而且果然...
bash$ tail -1 /tmp/foo
while true ; do echo 1 ; echo 2>/dev/null ; sleep 30 ; done
Run Code Online (Sandbox Code Playgroud)
为了以后方便重用,我编写了一个bash 脚本,使该过程自动化。
由于该命令仍在屏幕中运行,其父 bash 尚未重读任何历史记录,因此:
^Z然后up arrow^A^A- 因为 screen(1) - 和导航^E)和 echo + 重定向到一个文件fg 追求命令执行有一些警告,但这在大多数情况下已经足够有用了。
| 归档时间: |
|
| 查看次数: |
7507 次 |
| 最近记录: |