从bash脚本运行几个命令
我认为这应该是直截了当的,但结果令我困惑。从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中没有任何内容出现。所以,我无法诊断问题。
任何建议将不胜感激。
pkill
将会在命令名称中包含任何包含ccpd
的内容。您的脚本被称为restartccpd.bash
。首先第一行是:
pkill ccpd
所以脚本启动,运行pkill
(其中不产生输出),并迅速杀死自己。达达!
最简单的解决方案是重命名脚本。你也可以这样做:
kill $(pgrep -l ccpd | grep -v restartccpd | awk '{print $1}')
这将产生proccess名称和PID的匹配ccpd
的列表,然后从列表中删除restartccpd
,然后用kill
杀害的过程。
由于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
代替)。
我完全明白,我不想以这种方式重新启动一个守护进程,相反这样做是不可原谅的罪。但是,我们正在谈论守护进程有其自身问题的特定情况。如果你想知道这种情况,你会想要访问这个网站(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
@MMA我只是剔除了线程,但我认为在这里做的正确的事情是修复'/ etc/init.d/ccpd'。作为最后的手段,使用'pkill -x'。你有没有试过问如何使这个打印机在[ubuntu.se]上工作? – Gilles 2012-08-12 18:08:02
你是说* *脚本失败后,如果你键入这些命令,它的工作原理? – 2012-08-11 09:55:10
我说的是三个命令,当从终端单独运行时,工作。无论是在运行脚本之前还是之后。该脚本在任何情况下都不起作用。 – Masroor 2012-08-11 10:11:27
如果你的脚本中没有'sudo',它会起作用吗? – 2012-08-11 10:28:59