如果在 bash 命令行中输入两个作业,以分号分隔:
$ job 1; job 2;
我该如何取消第二个?如果我按CTRL+ c,第一个将被取消,并且“作业 2”将启动,我只想停止第二个作业而不执行。我尝试了 atq、ps,但没有成功,使用 ps -ef 我只能看到“作业 1”,但没有列出“作业 2”,所以我无法让 PID 使用 kill。我知道我可以使用 && 代替 ; 但现在太晚了,我在我的服务器而不是家用电脑上意外运行了这个命令,现在我正试图弄清楚如何防止灾难发生。
该问题特定于 rsync 命令,后跟另一个命令:
$ rsync ..... ; sudo shutdown -h now
通过 ID 终止进程或者终止其父进程都是行不通的。
经过几个小时的测试,我将其隔离到 rsync,其他命令我能够以各种顺序用CTRL+终止c,但如果它们位于某些命令(如 rsync 或 ping)之后则不行,我尝试了不同的 Ubuntu 版本、内核、没有 sudo 用户的服务器,并且我可以在任何地方重现它,避免此问题的最佳方法是在 rsync 后使用 && 仅在成功退出代码 0 时执行以下命令:
$ rsync .... && job 2
答案1
杀死父进程与 的 job1 SIGKILL
。
在进程树中显示进程,例如使用htop
或ps axf
并终止job1 的父进程而不是 job1 本身。
安装htop
sudo apt-get install htop
反对者,请在反对之前先了解答案
答案2
我觉得你错过了一些东西,当你运行两个用 + 分隔的命令时,你可以用+;
来终止这两个命令。CTRLc
为了确保万无一失,请尝试以下命令:
find / -name a ; ls /home
CTRL然后使用+终止上述命令c,这将终止两个进程,您将不会列出您的主页内容。即,下一个命令将不会运行。
更新:这也适用于您的rsync
命令。以下是我的例子:
$ rsync -avz /var/cache/apt/archives/ /tmp/backups/ ; sudo shutdown -h now
sending incremental file list
created directory /tmp/backups
./
authbind_1.2.0build3_amd64.deb
................
^Crsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(549) [sender=3.0.9]
[sudo] password for user:
因此,正如您在上面看到的,当您运行CTRL+时c,这将终止第一个命令,并且在启动关机时它会要求您输入密码,因此您现在可以再次使用+sudo
终止第二个进程。CTRLc
更新 2作为解决问题的办法,你可以这样做:
- 由于您使用无密码,因此通过编辑 sudoer 文件
sudo
再次要求输入密码sudo
sudo visudo
- 如果没有其他办法,作为最后一步这只是一种 hack,不建议这么做编辑
/sbin/shutdown
命令以删除+x
或将其重命名为不同的名称。