sh sys-snap.sh &


sh是什么?
sys-snap.sh是什么?
为什么我要在行尾添加&
有人可以解释一下语法吗?

在没有&的情况下,直到按Ctrl + C脚本才会返回到提示。
&的情况下,我可以按Enter键并且它起作用。

评论

双&符与&符与单&符有什么区别?

@CharlieParker您是否找到了答案?我试图自己找出区别。 (编辑:没关系,在更深处找到了它)

#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.shman 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/shchmod表示当前的工作目录),您将得到:

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