如何查看在某个 bash 实例中执行的确切命令行?

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)

这可能吗?

编辑#1

为我得到的一些答案添加反例。

  1. 关于使用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)
  2. 使用ps -p PID --noheaders -o cmd同样没用:

    $ ps -p 8909 --no-headers -o cmd
    bash
    
    Run Code Online (Sandbox Code Playgroud)
  3. 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 脚本,使该过程自动化。

  • @slm:无法抗拒 - 我在这里写了博客:http://users.softlab.ece.ntua.gr/~ttsiod/bashheimer.html (12认同)

Llo*_*eki 5

由于该命令仍在屏幕中运行,其父 bash 尚未重读任何历史记录,因此:

  • 重新连接到屏幕
  • ^Z然后up arrow
  • 奖励:将命令用单引号括起来(使用^A^A- 因为 screen(1) - 和导航^E)和 echo + 重定向到一个文件
  • fg 追求命令执行

有一些警告,但这在大多数情况下已经足够有用了。