我正在同步几个目录。我打开了一个 bash 终端,正在执行如下操作:
for DIR in * ; do rsync -a $DIR example.com:somewhere/ ; done
Run Code Online (Sandbox Code Playgroud)
但是,如果我想停止这一切,我按 Control-C。这会停止 rsync,但它会继续进行下一个。在这种情况下,我意识到发生了什么,然后像疯子一样按下 Control-C,直到一切恢复正常。
有什么方法可以“解决”这个问题。我想要它,所以如果我有一个这样的循环,然后按 Control-C,它会将我返回到我的 bash shell。
如果我通过在命令行中正常键入来启动一个进程,例如
wget http://site.com/bigfile.zip
Run Code Online (Sandbox Code Playgroud)
然后决定我想把它移到后台,我知道我可以使用像ctrl+z
然后bg 1
(或者jobs
如果需要的话首先)把它放在后台。
我的问题是是否有一种方法可以将工作从前台直接移动到后台而不停止它 - 就像另一个捷径 ctrl+z
。
我也意识到我可以附加&
到原始命令的末尾以在后台启动它,但问题在于您何时在前台启动一个进程然后意识到您想将它移到后台。
我似乎无法找到一种通过 ssh 管理工作的体面方法。我想在 ssh 会话中开始一项工作,注销,重新登录,做一个 fg,检查工作,注销,然后重复整个过程。nohup 似乎效果不佳。
我用过这个命令
$ nohup script & > nohup.out
[1] 28128
$ nohup: ignoring input and appending output to `nohup.out'
[1]+ Exit 255 nohup script
Run Code Online (Sandbox Code Playgroud)
如果我这样做
$ jobs
$ ps -ef | grep script
Run Code Online (Sandbox Code Playgroud)
我什么也没得到,即找不到进程。
另外,我有一个相关的问题是:如果我在 ssh 会话中,并且想将作业发送到后台,则 ctrl-z 不起作用。该怎么办?
任何人都可以帮助我吗?
在 systemd(UbuntuLinux 18.04 bionic 上的 v237)中,我可以创建一个服务文件(用于A.service
),并指定另一个服务Requisite=B.service
。这意味着如果我尝试启动A.service
但B.service
尚未运行,则 A.service 将不会启动。这是 的弱版本,当我尝试启动时Requires
它将启动。B.service
A.service
有相反的吗?我可以说\xe2\x80\x9c如果B.service正在运行,那么就不要启动这个服务\xe2\x80\x9d / \xe2\x80\x9c如果B.service正在运行,那么A.service无法启动\xe2\ x80\x9d?
\n\n文档说如果我这样做Conflicts=B.service
,那么启动A
将停止 B 然后启动 A。但我不希望 B 停止,我只是希望 A 无法启动。我想要的东西就是Conflicts
这样Requisite
的Requires
。
我可能可以将 更改ExecStart
为会失败的 shell 命令systemctl is-active B.service
或某种 hack。有没有合适的解决办法呢?
是否可以在 Bash 中从另一个 shell 脚本调用 shell 脚本,但原始脚本不能等待子脚本完成?