nohup的混乱行为

时间:2014-06-05 11:31:01

标签: linux perl

使用&运行nohup在命令行上,它返回进程ID, 虽然我在反引号中的perl脚本中运行相同的命令并尝试读取输出但不返回任何输出。 有人可以指导吗?

 nohup rm -rf ragh &
 [1] 10029

4 个答案:

答案 0 :(得分:2)

在终端中启动后台进程时,shell会打印作业号和PID。 nohup无关紧要。如果您不从终端启动作业(即在shell上使用Perl中的反引号,或者使用普通子shell),则不会显示该信息。无论如何,你为什么需要它?有关详细信息,请参阅perlipc - Perl interprocess communication

答案 1 :(得分:2)

如果您需要后台作业的进程ID,请使用$!变量,例如:

nohup start_long_running_job &
echo $! > jobid.txt

然后如果你需要杀死这份工作:

kill $(cat jobid.txt)

无论有没有nohup,它同样适用。

答案 2 :(得分:0)

nohup表示您生成一个新进程并在该上下文中执行该脚本。 如果你的命令需要比你的起始脚本更长的时间,它将在你的shell关闭后继续存在。如果您需要输出,则应将其传送到其他地方

nohup rm -rf ragh > log.txt &

答案 3 :(得分:0)

choroba在未显示PID时正确说明(“如果您没有从终端启动作业”)。 Richard RP正确地说可以使用$!。但是为了在反引号中运行Perl脚本,另外我们需要关闭命令的标准输出,否则只有在进程完成后才会返回反引号调用,因为perl会等待输出的EOF。

$pid = `nohup rm -rf ragh >&-& echo \$!`

rm中获取$pid的PID。