摘要
正在生成中……
nohup命令
使用&
命令后,作业会被提交到后台运行,当前控制台没有被占用,但是一但把当前控制台关掉(退出帐户时),作业就会停止运行。
但 nohup
命令可以在你退出帐户之后继续运行相应的进程。nohup
就是不挂起的意思( no hang up)。该命令的一般形式为:
nohup command &
如果使用nohup
命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out
的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1 &
使用了nohup
之后,很多人就这样不管了,其实这样有可能在当前账户非正常退出或者结束的时候,命令还是自己结束了。所以在使用nohup
命令后台运行命令之后,需要使用exit
正常退出当前账户,这样才能保证命令一直在后台运行。
命令前后台切换的方法:
ctrl + z
可以将一个正在前台执行的命令放到后台,并且暂停
jobs
查看当前有多少在后台运行的命令
fg
将后台中的命令调至前台继续运行
如果后台中有多个命令,可以用 fg %jobnumber
将选中的命令调出,%jobnumber
是通过jobs
命令查到的后台正在执行的命令的序号(不是pid)
bg
将一个在后台暂停的命令,变成继续执行,如果后台中有多个命令,可以用bg %jobnumber
将选中的命令调出。
20220705更新:使用nohup执行多条命令
源自我构建 youtube-dlp
下载时需要做的两个动作,启动 docker 容器下载油管视频到指定位置,下载完成后将文件移动到指定的目录(其实就是挂载的webdav 阿里云网盘或者中国移动网盘)。
在外网找到类似的问题 ,总结一下解决的思路有两种:
第一种是使用 sh -c
(或者bash -c
) 对命令进行包装 ,多条命令之间以 “&&
” 连接,如:
# 因为url可能含有特殊字符,造成安全问题,这种写法比较好
nohup sh -c "wget \"$url\" && wget \"$url2\"" > /dev/null 2>&1 &
另一种写法是把命令写入一个单独的shellscript
,用nohup
执行
nohup bash command.sh