如何在保持第一个命令运行的同时阻止链中的第二个命令?

如何在保持第一个命令运行的同时阻止链中的第二个命令?

昨天睡觉前我开始了一个漫长的过程,我以为它会在我起床之前完成,因此我使用了

./command && sudo poweroff

我的系统配置为不要求输入密码sudo poweroff,因此该命令完成后它应该关闭。

但是它仍在运行,我现在想使用该系统执行其他任务。在后台运行该命令不是问题,但我的系统可能随时关闭才是问题。

有没有办法阻止zsh执行poweroff命令,同时确保第一个命令运行直到完成?

在这种情况下,编辑/etc/sudoers文件以便系统询问我的密码是否仍然有帮助?

答案1

正如您在评论中澄清的那样,它仍然在交互式 shell 的前台运行,您应该能够按Ctrl+Z

这将暂停./command工作。除非./command实际拦截到SIGTSTP信号并在这种情况下选择exit(0)(不太可能),否则退出状态将为非0(128+SIGTSTP,一般为148),因此sudo poweroff不会运行。

然后,您可以使用或./command在前台或后台恢复。fgbg

您可以使用以下方法进行测试:

sleep 10 && echo poweroff

当您按下并稍后使用/恢复时,请注意poweroff不会输出。Ctrl+Zfgbg

或者与

sleep 10 || echo "failed: $?"

failed: 148一按就可以看到Ctrl+Z

请注意,这对于zsh并假设您使用 开始是有效的./command && sudo poweroff。它可能对其他 shell 无效,并且如果您以其他方式启动它,例如(./command && sudo poweroff)在子 shell 中或{ ./command && sudo poweroff; }作为复合命令的一部分(zsh与大多数其他 shell 相反,它会转换为子 shell,因此可以将其恢复为暂停时是一个整体)。

答案2

您可以暂时重命名 /sbin/poweroff 。

答案3

有没有办法阻止 zsh 执行 poweroff 命令,同时确保第一个命令运行直到完成?

gdb我认为除非您使用类似编辑正在运行的进程的内存之类的东西,否则这是不可能的。

在这种情况下,编辑 /etc/sudoers 文件以便系统询问我的密码是否仍然有帮助?

应该有帮助。

相关内容