如何在 rsync 之后按顺序取消下一个作业

如何在 rsync 之后按顺序取消下一个作业

如果在 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

在进程树中显示进程,例如使用htopps 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再次要求输入密码sudosudo visudo
  • 如果没有其他办法,作为最后一步这只是一种 hack,不建议这么做编辑/sbin/shutdown命令以删除+x或将其重命名为不同的名称。

相关内容