0

我想知道是否有办法捕获在非交互式 shell 上执行的进程列表?

基本上我有一个脚本,它从其他来源调用一些变量,我想看看所述变量的值是什么。但是,脚本执行并完成得非常快,因此我无法使用 ps 捕获值。

有没有办法记录进程以及使用了哪些参数?

TIA哈士奇

编辑:

在这种情况下,我使用的是 Solaris。我什至考虑过使用一个快速循环脚本来捕获正在传递的值——但这似乎不太准确,而且我确信执行并不总是被捕获。我试过这个:

   #!/bin/ksh

   while [ true ]
   do

   ps -ef | grep  $SCRIPT_NAME |egrep -v 'shl|lis|grep' >> grep_out.txt

   done

我会使用 sleep 但我不能指定任何精度,因为我所有的 sleep 可执行文件都需要一个整数值而不是任何小数值。

4

3 回答 3

3

在 Solaris 上:

truss -s!all -daDf -t exec yourCommand 2>&1 | grep -v ENOENT

在 AIX 和其他可能的基于 System V 的操作系统上:

truss -s!all -daDf -t execve yourCommand 2>&1 | grep -v ENOENT

在 Linux 和其他支持 strace 的操作系统上,您可以使用以下命令:

strace -ff -etrace=execve yourCommand 2>&1 >/dev/tty | grep -v ENOENT

如果您要跟踪的命令已经在运行,您可以将 pid 替换yourCommand-p pid要跟踪的进程的进程 ID。

编辑:

这是一种在 Solaris 下跟踪正在运行的脚本的方法:

for pid in $(pgrep -f $SCRIPT_NAME); do
    truss -s!all -daDf -t exec -p $pid 2>&1 | grep -v ENOENT > log.$pid.out &
done

请注意,使用 Solaris,您也可以使用dtrace来获得相同(甚至更多)。

于 2014-10-01T16:52:37.037 回答
3

大多数 shell 都可以在调试模式下调用,其中正在执行的每个语句在变量替换和扩展之后都会打印到 stdout(或 stderr)。

对于 Bourne 类 shell ( sh, ),使用选项(如 in )或使用脚本本身中的语句bash启用调试。-xbash -x myscriptset -x

但是,调试仅适用于“当前”脚本。如果脚本调用其他脚本,这些其他脚本将不会在调试模式下执行。此外,函数内部的代码也可能不会在调试模式下执行 - 取决于特定的 shell - 尽管您可以set -x在函数中使用以显式启用调试。

于 2014-10-01T14:58:28.307 回答
2

一个更详细(至少默认情况下)的选项是为此使用类似strace的东西。

strace -f -o trace.out script.sh

将为您提供有关脚本正在做什么的大量信息。对于您的特定用途,您可能希望通过-e trace=....控制跟踪哪些系统调用的选项来限制输出。

在 Solaris 上使用truss而不是。在 OS X 上strace使用(我相信)。dtruss使用适当的命令行参数也可以更改。

于 2014-10-01T15:19:16.977 回答