nohup
是一个 Unix 和 Linux 命令,用于运行关闭时不会被终止的进程(即"不挂起"的进程)。当你看到 nohup: ignoring input
这个错误时,通常意味着你尝试使用 nohup
去运行一个需要交互式输入的命令【不是这个原因】。nohup
默认情况下会忽略任何输入,并将标准输入重定向到 /dev/null
。
解决方法:
-
如果你正在运行的命令确实需要交互式输入,你可以将输入重定向到某个文件,或者使用管道(pipe)将输入传递给命令。
-
如果你不需要命令的任何输入,确保你运行的命令不要期望任何交互式输入。
例如,如果你的命令是 mycommand < input.txt
,而你希望 nohup
运行它,你可以简单地运行 nohup mycommand &
,这样 nohup
就不会尝试从标准输入读取数据。如果你的命令需要从文件读取输入,可以使用 cat input.txt | nohup mycommand &
。
test.py
import time while True: #time.sleep(3) print("pass ")
[root@VM-8-12-centos Recorder]# nohup python test.py > tes.txt 2>&1 & [1] 11046 [root@VM-8-12-centos Recorder]# [root@VM-8-12-centos Recorder]# more tes.txt nohup: ignoring input pass pass pass pass pass pass pass
import time while True: time.sleep(3) print("pass ")
[root@VM-8-12-centos Recorder]# [root@VM-8-12-centos Recorder]# nohup python test.py > tes.txt 2>&1 & [1] 13596 [root@VM-8-12-centos Recorder]# [root@VM-8-12-centos Recorder]# more tes.txt nohup: ignoring input [root@VM-8-12-centos Recorder]#
[root@VM-8-12-centos Recorder]# cat > a.py # script.py import time print("Running in the background") time.sleep(10) # 休眠10秒 print("Finished sleeping") [root@VM-8-12-centos Recorder]# nohup python a.py > a.txt 2>&1 & [2] 20380 [root@VM-8-12-centos Recorder]# more a.txt nohup: ignoring input
[root@VM-8-12-centos Recorder]# more a.txt
nohup: ignoring input
Running in the background
Finished sleeping
time.sleep nohup: ignoring input
解释:
time.sleep
是 Python 中的一个函数,用于暂停程序的执行。nohup
是一个 Unix 命令,用于运行关闭时不会被挂起的(no hang up)程序。
当你在终端中运行一个脚本,并且脚本中有 time.sleep
函数,然后你使用 nohup
运行这个脚本并且重定向输出到一个文件时,你可能会看到 "nohup: ignoring input" 的消息。这是因为 nohup
默认忽略输入,即使是当运行的命令期望输入时。
解决方法:
如果你的脚本需要与用户交互(例如,需要从标准输入接收数据),那么你不应该使用 nohup
。如果你的脚本不需要用户交互,那么你可以安全地使用 nohup
,这时 "nohup: ignoring input" 的消息不是一个错误。
如果你需要运行一个需要用户交互的脚本,并且希望它在后台运行,可以考虑以下方案:
-
使用
screen
(https://www.cnblogs.com/emanlee/p/3424635.html) 或tmux
创建一个会话,在会话中运行你的脚本,然后离开会话。脚本将在后台运行,即使你的终端关闭,它也不会停止。 -
如果你只是想要脚本在后台运行,并且不需要与终端会话连接,可以修改你的脚本,让它不使用
time.sleep
来暂停,而是使用一个循环来管理时间间隔,并且使用nohup
运行脚本,并重定向输入和输出。
例如:
nohup python your_script.py > output.log 2>&1 &这将在后台运行 your_script.py
,将标准输出和标准错误重定向到 output.log
文件,并且忽略输入。
import time
import threading
while True:
event = threading.Event()
print('...部分代码...')
event.wait(5)
print('...剩下的代码...')
[root@VM-8-12-centos Recorder]# nohup python test.py > tes.txt 2>&1 &
[1] 31788
[root@VM-8-12-centos Recorder]# more tes.txt
nohup: ignoring input
只有全部 time.sleep 都运行完了,才能开始输出内容到 tes.txt 文件中。
即使把print放到很靠前的位置,把time.sleep 放到最后一行。
如下:
# script.py
import time
print("Running in the background")
print("Finished sleeping")
time.sleep(1) # 休眠10秒
print("Running in the background")
print("Finished sleeping")
time.sleep(1) # 休眠10秒
print("Running in the background")
print("Finished sleeping")
time.sleep(1) # 休眠10秒
print("Running in the background")
print("Finished sleeping")
time.sleep(1) # 休眠10秒
print("Running in the background")
print("Finished sleeping")
time.sleep(1) # 休眠10秒
print("Running in the background")
print("Finished sleeping")
time.sleep(1) # 休眠10秒
print("Running in the background")
print("Finished sleeping")
time.sleep(1) # 休眠10秒
print("Running in the background")
print("Finished sleeping")
time.sleep(11) # 休眠10秒