2

我认为这应该很简单,但结果让我感到困惑。

当我使用命令运行 bash 脚本时,

sudo ./restartccpd.bash

屏幕上什么也没有出现。还有问题

sudo /etc/init.d/ccpd status

运行脚本后独立于屏幕产生空,而不是显示守护进程的 pid。这证明只有 pkill 命令在工作。

脚本的内容是,

#!/bin/bash

sudo pkill -9 ccpd
sudo /etc/init.d/ccpd start
sudo /etc/init.d/ccpd status

从终端运行时,这些命令可以正常工作。但是,如上所述,当作为脚本运行时,它无法按预期工作。

我尝试在命令之间插入 sleep 命令,但无济于事。此外,系统日志中没有任何内容。所以,我无法诊断问题。

任何建议将不胜感激。

4

2 回答 2

6

pkill将杀死ccpd命令名称中包含的任何内容。您的脚本称为restartccpd.bash. 第一行是:

pkill ccpd

因此脚本启动、运行pkill(不产生任何输出)并立即杀死自己。达达!

最简单的解决方案是重命名脚本。您还可以执行以下操作:

kill $(pgrep -l ccpd | grep -v restartccpd | awk '{print $1}')

这会产生一个进程名称和 pids 匹配的列表,ccpd然后从列表中删除restartccpd,然后用 杀死进程kill

于 2012-08-11T13:22:22.670 回答
0

正如larsks 正确诊断的那样,pkill ccpd杀死名称包含的所有进程ccpd。包括你的脚本。

直接的解决方法是将-x选项传递给pkill,以便它只匹配名称完全为 的进程ccpd

请注意,如果您的脚本包含sudo命令,则不需要使用sudo. 或者,您可以sudo从脚本中删除所有调用,并使用sudo.

但是,您不应运行此脚本。您通常应该调用 init 脚本来关闭服务:/etc/init.d/ccpd stop. 除了杀死守护程序之外,这可能会执行其他必要的清理,例如删除临时文件和锁。您应该使用的唯一情况kill -9是出现严重错误导致/etc/init.d/ccpd stop失败,在这种情况下,您应该在重新启动守护程序之前手动进行必要的清理。

做你想做的事情的正确方法是

sudo /etc/init.d/ccpd restart

(假设你的发行版使用传统的 SysVinit——如果它使用 upstart,你应该运行它sudo service ccpd restart)。

于 2012-08-11T14:55:00.627 回答