sh sys-snap.sh &
sh
是什么?sys-snap.sh
是什么?为什么我要在行尾添加
&
?有人可以解释一下语法吗?
在没有
&
的情况下,直到按Ctrl + C脚本才会返回到提示。在
&
的情况下,我可以按Enter键并且它起作用。#1 楼
sh
是默认的Bourne兼容外壳程序(通常是bash或破折号)sys-snap.sh
是一个外壳程序脚本,其中包含sh
执行的命令。由于您不发布其内容,所以我只能从其名称中猜出它的作用。
我可以找到一个与CPanel相关的,具有相同文件名的脚本,该脚本将创建一个包含所有当前进程,当前内存使用情况,数据库状态等的日志文件。
如果该脚本以shebang行(
#!/bin/sh
或类似名称)开头,如果在当前目录中,则可以使其通过chmod +x sys-snap.sh
执行,并直接使用./sys-snap.sh
来启动它。背景,因此您可以继续使用该Shell,而不必等到脚本完成。如果忘记了它,可以使用
&
停止当前运行的进程,并使用Ctrl-Z
在后台继续运行(或在前台显示bg
)。有关更多信息,请参见作业控制
评论
在基于Linux的系统(或最新的OS / X)中,sh通常仅是bash或dash。在BSD上,它通常是Ash的另一种变体(破折号基于NetBSD sh,其本身基于Almquist Shell)或pdksh派生。在商业Unices上,通常是ksh88。
–StéphaneChazelas
2013年8月10日15:00
@jofel:如果下面的脚本正在运行并且错误地执行了Ctrl-C,该怎么办。我的脚本会执行还是会终止?例如:sh sys-snap.sh&
–侯赛因7
16年8月2日在10:38
@ Hussain7 Ctrl-C始终发送到前台的当前进程。如果shell脚本以&开头,因此在后台启动,则只会得到一个新的shell提示。
– jofel
16年8月4日在12:00
双&符与&符与&符有何区别?
–查理·帕克(Charlie Parker)
17年1月16日在21:35
@CharlieParker是的,“ &&”是“ and”功能。 &&之后的命令仅在成功之前的命令时调用。示例“ true && echo正常”输出“有效”,但是“ false && echo no输出”不调用echo函数。
– jofel
17年1月17日在14:47
#2 楼
在UNIX下称为job control
。 &
通知外壳程序将命令放在后台。这意味着它将继续运行sys-snap.sh
命令,但会将您返回到外壳程序以允许您继续执行并行命令。 您可以看到使用
jobs
命令当前正在运行的作业列表。您可以使用fg
命令返回命令(转到'foreground)。这会将命令拉回到看不到提示的状态,必须发出Ctrl-C才能终止该进程。但是,您可以通过发出Ctrl-Z暂停(暂停)该过程。这将暂停sys-snap.sh
并返回到您的提示。然后,您可以使用&
命令将其作为背景(就好像您是用bg
发出的一样),并且它将在Ctrl-Z放入的暂停状态下恢复运行。请注意,一次可以有一个以上的工作(如
jobs
所示):将是%1
。如果使用不带参数的sys-snap.sh
或%2
,它将对上面another-script.sh
输出中fg
标记的作业执行命令。 bg
会将
+
放回前台,同时将jobs
留在后台。 您可以向正在运行的作业发出Ctrl-C序列,而不必使用
fg %1
命令将其前台运行,sys-snap.sh
会将等效的Ctrl-C发送到another-script.sh
。如果如果您使用的是bash shell,则
kill
命令的“作业控制”部分下有一个详细部分,以进行更详细的介绍。至于
kill %1
的名称,unix下的文件名是任意的(有一些例外,例如动态加载程序文件)。不需要它们具有特定的文件扩展名即可使它们作为Shell脚本运行,调用其他命令,例如sys-snap.sh
或man bash
等。通常是为了清楚起见,在这种情况下,sys-snap.sh
是使用以下命令的Shell脚本Bourne Shell perl
。 php
的功能部分(当您使用.sh
命令查看其内容时)是Shebang。在第一行中,您可能会发现以下其中一个:[1]- Running sys-snap.sh &
[2]+ Running another-script.sh &
或类似名称。用基本的术语来说,运行
/bin/sh
之后的命令(例如sys-snap.sh
),然后将脚本文件其余部分的内容一次馈入一行。请注意,还必须使用less
将文件设置为可执行文件,以便您可以将其作为命令运行。如果未设置权限,则#!
无效,因为您将得到以下错误:#! /bin/sh
#! /bin/bash
#! /usr/local/bin/bash
,或者如果您通过显式路径
/bin/sh
(chmod
表示当前的工作目录),您将得到:bash: sys-snap.sh: command not found
另一种选择是将其保留为没有执行权限,并明确要求/ bin / sh来运行它:
bash: ./sys-snap.sh: Permission denied
评论
这是一个很好的答案。一个可能的建议是也添加nohup的功能,因为它经常与&结合使用以启动一个进程,并能够在不终止该进程的情况下终止启动它的shell。
–汤米
2015年10月14日在14:49
@Drav,是真的,如果作业是第一个命令,作业将总是返回空吗?
–起搏器
17年12月15日在22:16
请注意,在命令末尾使用&仅会分离stdin(而不分离stdout或stderr),这意味着如果您的命令/脚本在后台运行但写入stdout,则可能会遇到Ctrl + c不会的情况停止输出,但您可以键入命令。这是因为后台进程正在向stdout写入数据,但是您无法停止它,因为它不在前台运行。更多信息在这里。
–vadasambar
19/09/17在14:52
#3 楼
sh
是外壳。哪个外壳完全取决于系统。使用bash
作为其标准shell的系统的示例:$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Mar 13 16:12 /bin/sh -> bash
$ sh --version
GNU bash, version 4.2.45(1)-release (x86_64-pc-linux-gnu)
sys-snap.sh
将是某种形式的shell脚本,因此sh sys-snap.sh
将执行该shell脚本。 > &
将使Shell进程在后台运行。如果没有&
,它将一直停留在前台,直到脚本结束。该脚本将以任何一种方式工作,这只是在执行其他命令之前等待脚本结束还是没有结束的问题。#4 楼
您的服务器在hostgator中吗?脚本
sys-snap.sh
是由hostgator团队编写的特殊脚本,用于收集系统的所有日志文件和数据,因此它们将其输出用于监视和收集系统信息。评论
不,我没有使用hostgator。
–user4951
13-10-25在6:54
@ J.Chang该脚本是HostGator和其他数百台主机使用的cPanel的一部分。
– 472084
17年7月5日在12:12
@ 472084,哪个cpanel版本?
–起搏器
17年12月15日在22:33
评论
双&符与&符与单&符有什么区别?@CharlieParker您是否找到了答案?我试图自己找出区别。 (编辑:没关系,在更深处找到了它)