![Bash 脚本的问题](https://linux22.com/image/975952/Bash%20%E8%84%9A%E6%9C%AC%E7%9A%84%E9%97%AE%E9%A2%98.png)
我的脚本出了点问题。我使用 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”,看看会发生什么。