Bash 脚本的问题

Bash 脚本的问题

我的脚本出了点问题。我使用 sudo 在后台执行一个命令,并尝试在变量中检索该命令的 PID。

代码如下:

#!/bin/bash

sudo badblocks -o $2 $1 & 

PROCESSID=$(pgrep -P $!)

echo $PROCESSID

我在 shell 中逐个执行了所有命令,一切正常,但启动脚本时却不起作用。我还有其他命令可以获取 PID,例如“ps --ppid $! -o pid=”,但同样不起作用。

你知道为什么吗?

答案1

问题

  • 在脚本中使用sudo通常不会达到预期的效果(请参阅 Digital Chris 的链接:“如何在脚本中运行这个 sudo 命令?”)。
  • sudo如果您需要提供密码,则发送到后台将无法工作(正确且可靠)。

解决方案

检索由 生成的进程内的进程 ID sudo。如果您使用exec,您甚至不需要将其用作pgrep -P拐杖。创建一个 shell 脚本,例如pid-badblocks.sh

#!/bin/sh
echo $$
exec badblocks -o "$2" "$1"

使其可执行并使用以下命令调用它:

sudo ./pid-badblocks.sh <DEVICE> <OUTPUT>

这是可行的,因为exec用 替换当前进程badblocks(在本例中),同时保持相同的进程 ID。因此,我们可以在调用 之前打印 shell 进程的进程 ID badblocks

答案2

猜猜看……

如果每个命令独立工作,则 PROCESSID 分配可能会发生得太快。

尝试在“sudo ...”后添加“sleep 3s”,看看会发生什么。

相关内容