我需要nohup
两个命令,一个接一个。第二个命令必须在第一个命令之后执行。以下是命令:
tar -zcf archive.tar.gz.tmp mydir
mv archive.tar.gz.tmp archive.tar.gz
我需要命令在后台运行,但显然不能同时运行。必须在第一个命令完成后运行第二个命令。我试过这个:
nohup tar -zcf archive.tar.gz.tmp mydir ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1 &
但命令不会在后台运行。bash 提示符会等到这两个命令完成后再给我另一个提示符。我需要它们在后台运行。
如果我做:
nohup tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 &
完美地在后台运行。仅当我尝试执行多个命令时。
我也试过:
nohup tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 & ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1 &
但这也没有用。语法无效之类的。我确定有办法做到这一点,但我只是不确定语法。
我能想到的唯一选择是将命令放入.sh
文件中,然后 nohup 该文件,但这不一定是我必须在 linux 系统上执行的操作(权限限制等)。
我认为你需要括号。
nohup $(tar -zcf archive.tar.gz.tmp mydir; mv archive.tar.gz.tmp archive.tar.gz) >/dev/null 2>&1 &
最简单的解决方案:创建一个 shell 脚本
并使用
nohup myscript
。可能在脚本中包含一些额外的文档。(是的,我是文档的傻瓜。特别是当与多人一起工作时,或者当你有一天可能离职而你的继任者需要弄清楚原因时。)
另一种方法可能是为子任务启动一个新的 shell(在本例中是你的 tar 和 move)
nohup `$(tar -zcf archive.tar.gz.tmp mydir; mv archive.tar.gz.tmp archive.tar.gz)
备选方案 2:
nohup ```tar -zcf archive.tar.gz.tmp mydir ; mv archive.tar.gz.tmp archive.tar.gz```。
不过我真的更喜欢剧本。当您或其他人在几年后查看他的脚本并想知道为什么要这样做时,其中的注释可能会非常有用。
在一个不相关的说明上:我到底如何发布带有反引号的 anser?(shell 的命令“使用此命令;将输出作为输入提供给另一个命令”)。
也许是 bash 包装?
您可以使用
screen
来发出命令并从屏幕会话中分离:这些命令将像使用 nohup 一样运行。