当我运行`./command.sh &`时,后台任务被挂起。我怎样才能让它继续运行?

当我运行`./command.sh &`时,后台任务被挂起。我怎样才能让它继续运行?

这就是我正在运行的:

alexandma@ALEXANDMA-1-MBP ./command.sh &
[2] 30374
alexandma@ALEXANDMA-1-MBP
[2]  + suspended (tty output)  ./command.sh

我不希望它开始暂停,我希望它继续在后台运行。我将在循环中运行这些,所以我需要一些能以这种方式工作的东西。

我怎样才能让它继续运行?

答案1

在 Anthon 的解释中添加细节:

写入后台进程并不总是停止。这取决于终端设置tostop

stty tostop
stty -tostop

可用于切换此设置。因此,如果您希望后台进程写入“另一个进程的”终端,那么您可以保持它运行,但不需要tmuxscreen或类似的。

答案2

它由于给出的原因而停止:它尝试输出到 tty。您可以尝试重定向输出(如果./command.sh支持),或者在它自己的窗口tmux中运行该命令。screen例如

 tmux new-window -n "window name" ./command.sh

tmux list-windows然后查看使用 创建并附加到的tmux窗口列表tmux attach

这样,程序仍然会等待输入/输出发生,但是一旦进入适当的窗口,您就可以轻松地提供输入,并且输出将被捕获而无需任何活动。

答案3

最简单的方法是执行以下命令:

 nohup ./command.sh </dev/null &

如果您使用 SH 变体(不是 CSH 变体)并且将终止您的会话,我会添加 nohup。

答案4

如果您的 shell 是 zsh 并且正在调用脚本sudo,并且您没有有效的缓存凭据(您之前没有运行 sudo,或者之前的凭据已过期),或者su您必须输入密码,则可能会收到此错误。

如果您不需要像其他答案提到的那样保留输出(例如在没有&tmux 或屏幕的情况下运行脚本),这里有一些可能的解决方案:

  • 在 sudoers 文件中禁用tty_tickets或设置为timestamp_typeglobal这样您就不必在所有终端中输入密码)和/或增加值timestamp_timeout(这会产生一些严重的安全隐患)。
  • sudo在运行脚本之前运行一个简单的命令,以便 sudo 在脚本中遇到时会缓存凭据。
  • 更改您的脚本,使其不调用 sudo 或 su。

相关内容