我已经在nohup中启动了一个python脚本。脚本包含一个finally块,如果发生任何异常或键盘中断,该块将打印队列中的剩余项目以打印到日志文件中。
只要我在执行脚本的同一个shell中,它就可以正常工作。下面的步骤如我所预料的那样起作用。
# Run the script in the background with nohup
nohup script_name.py > script_name.log 2>&1 &
# List the processes currently running in the background
jobs
# Bring back the process to foreground
fg 1
# Send Keyboard interrupt to stop the process by allowing to execute finally code block
Press CTRL+C
The script prints all the pending items in the queue to the "script_name.log" file.
但问题是,一旦我从我开始的地方退出当前的shell;nohup";进程,我无法再将该进程带回前台以发送键盘中断。
同时,如果我使用kill PROCESS_ID
命令,它不允许执行finally
块,所以我也会丢失队列中的挂起项目。
是否有任何方法可以终止进程或向nohup进程发送键盘中断,仍然允许finally
块执行代码?
谢谢。
更新:高级python代码:它实际上是一个Python项目,有很多目录和其他脚本,但让我在这里只给出代码的finally block部分。
try:
cc = crawler.MultiThreadedWebCrawler(max_workers)
cc.run_web_crawler()
finally:
cc.info(script_start_time)
# Inside another script, the definition of "info" method is,
def info(self, script_start_time):
print('n', self.crawl_queue.qsize(), ' URLs in crawl_queue are:n')
while self.crawl_queue.qsize() > 0:
print(self.crawl_queue.qsize(), ' ', self.crawl_queue.get(), 'n')
print("Script execution started at ", script_start_time)
print("Script execution ended at ", datetime.now().strftime('%Y-%m-%d__%H_%M_%S'))
使用txt文件中的值作为终止开关。
让你的程序每次完成都打开一个txt文件,这就是"作业"。检查提取的值是1
还是0
。如果是0
,则继续。如果是1
,则退出脚本并输出结果。
KillOrStay = open("/root/KillOrStay.txt").readlines()[0]
if int(KillOrStay) == 1:
# Output your results here
exit()
else:
pass