我认为这应该是直截了当的,但结果令我感到困惑。
当我使用命令运行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命令,但没有任何效果。此外,syslog中没有任何内容。所以,我无法诊断问题。
任何建议将不胜感激。
答案 0 :(得分:6)
pkill
会杀死命令名中包含ccpd
的任何内容。您的脚本名为restartccpd.bash
。第一行是:
pkill ccpd
因此脚本启动,运行pkill
(不产生输出)并立即杀死自己。塔达!
最简单的解决方案是重命名脚本。你也可以这样做:
kill $(pgrep -l ccpd | grep -v restartccpd | awk '{print $1}')
这将生成与ccpd
匹配的进程名称和pid列表,然后从列表中删除restartccpd
,然后使用kill
终止进程。
答案 1 :(得分:0)
作为larsks correctly diagnosed,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 - 如果它使用新手,则应该运行sudo service ccpd restart
)。