我需要使用nohup使用bash启动一个python脚本,传递一个arg,它有助于在我导入的脚本中定义一个常量。关于传递args有很多问题,但我还没有找到使用nohup的成功方法。
我的bash脚本的简化版本:
#!/bin/bash
BUCKET=$1
echo $BUCKET
script='/home/path/to/script/script.py'
echo "starting $script with nohup"
nohup /usr/bin/python $script $BUCKET &
我正在导入的配置脚本的相关部分:
FLAG = sys.argv[0]
if FLAG == "b1":
AWS_ACCESS_KEY_ID = "key"
BUCKET = "bucket1"
AWS_SECRET_ACCESS_KEY = "secret"
elif FLAG == "b2":
AWS_ACCESS_KEY_ID = "key"
BUCKET = "bucket2"
AWS_SECRET_ACCESS_KEY = "secret"
else:
AWS_ACCESS_KEY_ID = "key"
BUCKET = "bucket3"
AWS_SECRET_ACCESS_KEY = "secret"
使用它的脚本:
from config import BUCKET, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY
#do stuff with the values.
坦率地说,因为我将args传递给了script.py,所以我不相信它们会进入导入脚本的范围。也就是说,当我采用类似的方法而不使用nohup时,它可行。
答案 0 :(得分:4)
通常,任何程序的参数向量都以程序本身开头,然后是所有参数和选项。根据语言的不同,该计划可能是sys.argv[0]
,argv[0]
,$0
或其他内容,但它基本上始终是参数#0。
每个程序的工作是运行另一个类似nohup
的程序,并且像Python解释器本身一样 - 通常会丢弃自身及其所有选项,并为目标程序提供命令行的其余部分。 / p>
因此,nohup
需要COMMAND
和零或更多ARGS
。在COMMAND
里面,argv[0]
本身就是COMMAND
(在这种情况下,'/usr/bin/python'
),argv[1]
及更高版本将是其他参数({{1}无论'/home/path/to/script/script.py'
解决了什么。)
接下来,Python为该脚本提供零个或多个选项,一个脚本以及零个或多个args,并将脚本及其args公开为sys.argv
。因此,在您的脚本中,$BUCKET
将为sys.argv[0]
,而'/home/path/to/script/script.py'
将为sys.argv[1]
解析为的任何内容。
而$BUCKET
的工作方式与Python类似; bash
将是bash包装器脚本的第一个参数($1
将是脚本本身),依此类推。因此,内部Python脚本中的$0
将最终获得传递给bash包装器脚本的第一个参数。
导入根本不会影响sys.argv[1]
。因此,在sys.argv
模块和顶级脚本中,如果config
,import sys
将sys.argv[1]
传递给bash包装器脚本。
(在某些平台上,在某些情况下$1
可能没有完整的路径,甚至可能是空的。但这与此无关。你关心的是最终的argv[0]
,并且sys.argv[1]
,bash
和nohup
都可以保证不受影响。)
答案 1 :(得分:0)
nohup python3 -u ./train.py --dataset dataset_directory/ --model model_output_directory > output.log &
这里我用python3执行train.py文件,然后-u用于忽略缓冲并在不存储的情况下显示日志,并使用参数样式和 model_output_directory指定我的 dataset_directory / strong>,然后大于符号(>)
然后将日志存储在 output.log 中,并最后使用(&)符号
终止此过程
ps ax | grep train
然后记下process_ID
sudo kill -9 Process_ID