这就是我正在运行的:
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
可用于切换此设置。因此,如果您希望后台进程写入“另一个进程的”终端,那么您可以保持它运行,但不需要tmux
,screen
或类似的。
答案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_type
(global
这样您就不必在所有终端中输入密码)和/或增加值timestamp_timeout
(这会产生一些严重的安全隐患)。 sudo
在运行脚本之前运行一个简单的命令,以便 sudo 在脚本中遇到时会缓存凭据。- 更改您的脚本,使其不调用 sudo 或 su。