我想让斯特雷斯做背景。比如说我在跑步
strace -esetsid setsid sleep 123
但是我想继续运行其他东西直到setsid返回。显然,简单地将&附加到
sleep 123
被解释为要跟踪的命令的一部分。那么,我如何在后台运行这个呢?我使用strace只是为了获取由setsid启动的新会话的pid。如果有比strace更好的方法,我也想知道:)谢谢
wi3ka0sx1#
试试这个:
setsid -w sleep 123 & ppid=$! # get the pid of the setsid command that we just launched pid=`ps --ppid $ppid --no-headers | awk '{ print $1 }'`
(with -w,setsid等待进程退出-并作为其父进程保持; ps --ppid N用于选择父进程是setsid进程的进程-应该只有一个-或者如果子进程在shell执行ps之前退出,则没有。请确保检查这一点- $pid将为空,然后)。
-w
ps --ppid N
ps
dtcbnfnu2#
在后台运行一些东西然后附加到它的问题是,您可能已经丢失了一些信息。因此,我建议使用一个子shell,并将该子shell放在后台:
( strace -o mystrace.out -esetsid setsid sleep 123 ) &
注意,子shell不是一个单独的进程,您可以直接获得预期的行为:
$ ( strace -o mystrace.out -esetsid setsid sleep 123 ) & [1] 21077 $ ps f PID TTY STAT TIME COMMAND 20524 pts/0 Ss 0:00 -bash 21077 pts/0 S 0:00 \_ strace -o mystrace.out -esetsid setsid sleep 123 21104 pts/0 R+ 0:00 \_ ps f
2条答案
按热度按时间wi3ka0sx1#
试试这个:
(with
-w
,setsid等待进程退出-并作为其父进程保持;ps --ppid N
用于选择父进程是setsid进程的进程-应该只有一个-或者如果子进程在shell执行ps
之前退出,则没有。请确保检查这一点- $pid将为空,然后)。dtcbnfnu2#
在后台运行一些东西然后附加到它的问题是,您可能已经丢失了一些信息。因此,我建议使用一个子shell,并将该子shell放在后台:
注意,子shell不是一个单独的进程,您可以直接获得预期的行为: