我需要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 系统上执行的操作(权限限制等)。
答案1
最简单的解决方案:使用以下命令创建一个 shell 脚本
#/bin/sh
tar -zcf archive.tar.gz.tmp mydir
mv archive.tar.gz.tmp archive.tar.gz
并使用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```。
不过我还是更喜欢这个剧本。几年后你或其他人看到这个剧本时,可能会想知道为什么会这样写,里面的注释可能会很有用。
无关的说明:我到底该如何发布带有反引号的答案?(shell 的命令是“使用此命令;将输出作为输入提供给另一个命令”)。
答案2
我认为你需要括号。
nohup $(tar -zcf archive.tar.gz.tmp mydir; mv archive.tar.gz.tmp archive.tar.gz) >/dev/null 2>&1 &
答案3
也许是防撞包装?
nohup bash -c 'tar -zcf archive.tar.gz.tmp mydir > /dev/null 2>&1 ; mv archive.tar.gz.tmp archive.tar.gz > /dev/null 2>&1' &
答案4
您可以使用screen
以下命令退出屏幕会话:
screen
tar -zcf archive.tar.gz.tmp mydir && mv archive.tar.gz.tmp archive.tar.gz
ctrl-a d to detach
该命令将像 nohup 一样运行。