2012-08-11 208 views
2

我认为这应该是直截了当的,但结果令我困惑。从bash脚本运行几个命令

当我使用命令运行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 

的命令正常工作从一个终端运行时。但是,如上所述,作为脚本运行时,它不能按预期工作。

我试图在命令之间插入睡眠命令,没有任何效用。此外,syslog中没有任何内容出现。所以,我无法诊断问题。

任何建议将不胜感激。

+1

你是说* *脚本失败后,如果你键入这些命令,它的工作原理? – 2012-08-11 09:55:10

+0

我说的是三个命令,当从终端单独运行时,工作。无论是在运行脚本之前还是之后。该脚本在任何情况下都不起作用。 – Masroor 2012-08-11 10:11:27

+0

如果你的脚本中没有'sudo',它会起作用吗? – 2012-08-11 10:28:59

回答

6

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

pkill ccpd 

所以脚本启动,运行pkill(其中不产生输出),并迅速杀死自己。达达!

最简单的解决方案是重命名脚本。你也可以这样做:

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

这将产生proccess名称和PID的匹配ccpd的列表,然后从列表中删除restartccpd,然后用kill杀害的过程。

+0

'grep | awk'反成语可以重写为'awk'!/ restartccpd/{print $ 1}'' – tripleee 2012-08-11 14:30:52

+0

@larsks您的解决方案非常完美。任何想法为什么它也适用于bin/bash行被删除?看到我上面的评论。 – Masroor 2012-08-11 14:39:19

+0

正确的诊断,但不是一个很好的解决方案。您的提案将杀死其名称包含'ccpd'的任何其他进程。 'pkill'有'-x'选项就是为了这个目的。 – Gilles 2012-08-11 14:55:50

0

由于larsks correctly diagnosed,杀死了名称为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代替)。

+0

我完全明白,我不想以这种方式重新启动一个守护进程,相反这样做是不可原谅的罪。但是,我们正在谈论守护进程有其自身问题的特定情况。如果你想知道这种情况,你会想要访问这个网站(http://radu.cotescu.com/how-to-install-canon-lbp-printers-in-ubuntu/)或特别是这个评论(http: //radu.cotescu.com/how-to-install-canon-lbp-printers-in-ubuntu/#comment-578224454)。 – Masroor 2012-08-11 22:11:58

+0

@MMA我只是剔除了线程,但我认为在这里做的正确的事情是修复'/ etc/init.d/ccpd'。作为最后的手段,使用'pkill -x'。你有没有试过问如何使这个打印机在[ubuntu.se]上工作? – Gilles 2012-08-12 18:08:02