我在zsh:(睡眠100;节目1&另一个程序和另一个)&
如何获得‘睡眠’过程的PID (我需要杀死它)?$! -返回pid而不是睡眠过程的作业-p -在这里也没用。
KILLALL-9睡眠-useless,因为它将杀死所有睡眠过程,而不仅仅是这个.
发布于 2021-11-22 09:09:21
一种选择是从sleep从一组命令中打印pid。这可以通过回定位睡眠过程,用$!获取pid,然后使用wait来阻止,直到它退出。
% (sleep 100 &; print sleep_pid:$!; wait $!; print cmd1 && print cmd2) &
[1] 18055
sleep_pid:18056
% kill 18056
cmd1
cmd2
[1] + done ( sleep 100 & print sleep_pid:$!; wait $!; print cmd1 && print cmd2; )
%如果需要以编程方式访问pid,可以将其写入临时文件或命名管道。
发布于 2021-11-21 19:37:24
刚刚找到了一个解决方案:
sleep_pid=`pstree -p $!|grep -o "[[:digit:]]*"|tail -1`发布于 2021-11-22 11:56:54
即使您使用的shell是Bourne风格的,并因此支持具有这些语义的exec内置程序,通常也不应该试图避免使用sh -c (或等效的)来为此目的创建一个新的单独的shell进程,因为:
一旦shell变成myCommand,就没有shell等待运行后续命令。sh -c 'echo $$;exec myCommand;foo在用myCommand替换自己之后将无法尝试运行foo。除非您正在编写一个脚本来运行这个脚本作为它的最后一个命令,否则不能只在运行其他命令的shell中使用echo $$;exec myCommand。不能为此使用子shell。(echo $$;exec myCommand)在语法上可能比sh -c 'echo $$;exec myCommand',但当您运行$$ inside ( )时,它给出父shell的PID,而不是子shell本身。但是,新命令的PID将是子subshell的PID。一些shell提供了自己的不可移植机制来查找子shell的PID,您可以使用它。特别是在Bash 4中,(echo $BASHPID;exec myCommand)确实可以工作。最后,请注意,一些shell将执行一个优化,当知道shell之后不需要做任何事情时,它们将运行命令,就像通过exec (即,它们首先放弃分叉)一样。有些shell试图在任何时候执行此操作--这是要运行的最后一条命令,而另一些则只在命令之前或之后没有其他命令时才会执行,而另一些则根本不执行。其结果是,如果您忘记编写exec并只使用sh -c 'echo $$;myCommand‘,那么有时它会在某些带有shell的系统上给出正确的PID。我建议永远不要依赖这种行为,而是在需要的时候总是包括执行人员。在运行myCommand之前,我需要在bash脚本中设置许多环境变量。这些代码会传递到运行exec命令的环境中吗?但是,当myCommand启动其他进程(这些进程是您需要处理的进程)时,这种方法不起作用;当我以这种方式发出获取pid的-INT时,信号不会到达由myCommand启动的子进程,而如果我在当前会话和Ctrl+C中运行myCommand,则信号会正确传播。-5月11日下午16点43分,我试了一下,但是myCommand过程的pid似乎是echo $$ +1的pid输出,我做错了什么吗?- crobar 28 '18在10:13,我的命令看起来是: sh -c 'echo $$;exec /usr/local/bin/mbdyn -f "input.file“-o /path/ to /outputdir”> "command_output.txt“2>&1 &‘- crobar 8月28日8月28日10:51,这太棒了,但是当我试图将回显的值放入变量中时,它并不适用于我,这样以后我就可以实际使用它来终止进程,例如PID=$(sh -c 'echo $$;exec myCommand'),而如果我删除PID=$(.)包装器显示PID并立即继续!
https://stackoverflow.com/questions/70057871
复制相似问题