当我make从 shell运行命令(在一个大项目上)时,我可以输入 Ctrl-Z 来停止进程并返回到 shell。随后,我可以运行fg以继续该过程。
我正在尝试编写一个 shell 脚本来自动执行此操作(具体来说,每隔几秒钟检查一次我的 CPU 温度,并在温度过高时停止该过程,因为我的计算机容易过热)。我的第一次尝试是这样工作的(简化):
make &
subpid="$!"
sleep 2
# If the CPU temperature is too high...
kill -STOP "$subpid"
sleep 2
# If the CPU temperature has dropped to safe levels...
kill -CONT "$subpid"
wait "$subpid"
Run Code Online (Sandbox Code Playgroud)
不幸的是,这没有用。向进程发送 SIGSTOP 并没有暂停它(正如它继续向终端发送输出所证明的那样)。我make &在命令行运行,发送 SIGSTOP,并使用ps;检查进程状态;它被列为已停止(并在我发送 SIGCONT 时再次启动),但它仍在喷出输出并提高我的核心温度!用 Ctrl-Z 停止它从来没有出现过这个问题,但我不知道如何在脚本中做到这一点。
是什么让 Ctrl-Z 与 不同kill -STOP,我如何在 shell 脚本中获得前者的行为?
我有一个 bash 脚本(从 Java 程序调用),它不断被杀死。我总是赶上signal 15,trap但随后出现了一些我怀疑是的其他信号,signal 9但对于它是否真的是一无所知signal 9。
我知道你不能trap signal 9,那么有没有其他方法可以判断是否signal 9正在杀死我的 shell 脚本?
将trap在bash内置的语法如下
Run Code Online (Sandbox Code Playgroud)trap [-lp] [arg] [sigspec ...]... 每个
sigspec都是信号名称或信号编号。信号名称不区分大小写,SIG 前缀是可选的。...
bash的说明书指出,sigspec可能是EXIT,DEBUG,RETURN,和ERR。它们是信号的名称吗?
为什么我在下面给出的所有信号名称列表中找不到它们,甚至SIG为它们添加前缀?
它们仅与 bash shell 相关,而与 Linux 操作系统无关吗?它们是 bash shell 信号而不是 Linux OS 信号吗?
$ trap -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) …Run Code Online (Sandbox Code Playgroud) 在他的关于网页的自管绝招,丹·伯恩斯坦解释了竞争条件select()和信号,提供一个解决办法,并得出结论认为,
当然,正确的做法是
fork()返回文件描述符,而不是进程 ID。
他的意思是什么 - 是否能够select()在子进程上处理其状态更改,而不必使用信号处理程序来获取这些状态更改的通知?
我正在遵循有关如何使用 ssh-agent 设置无密码 SSH 身份验证的指南。
要启动 ssh-agent,作者建议在 中使用以下代码.bash_profile:
SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
eval `$SSHAGENT $SSHAGENTARGS`
trap "kill $SSH_AGENT_PID" 0
fi
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它会捕获信号 0。根据man 7 signal没有这样的信号。
这只是一个错字或错误,还是真的有什么成就?
我有一张可以启动到 Linux 并运行一个小的 Bash 脚本的 live CD。该脚本搜索并运行第二个程序(通常是编译后的 C++ 二进制文件)。
您应该能够通过按Ctrl+来中止第二个程序C。什么应该发生的是,第二个节目暂停,和bash脚本运行继续清理。什么实际发生的是主应用程序和bash脚本都终止。这是一个问题。
所以我使用trap内置命令告诉 Bash 忽略 SIGINT。现在Ctrl+C终止 C++ 应用程序,但 Bash 继续运行。伟大的。
哦,是的...有时“第二个应用程序”是另一个 Bash 脚本。在这种情况下,Ctrl+C现在什么都不做。
显然我对这些东西如何工作的理解是错误的......当用户按下Ctrl+时,我如何控制哪个进程获得 SIGINT C?我想将此信号定向到一个特定的进程。
我想从脚本运行和配置一个类似于守护进程的进程。
我的 shell 是在 Cygwin 下模拟的 zsh,守护进程是SFK,一个基本的 FTP 服务器。
对于此处重要的内容,startserv.sh可以按如下方式起草脚本:
#!/bin/sh
read -s -p "Enter Password: " pw
user=testuser
share=/fshare
cmd="sfk ftpserv -user=$user -pw=$pw -usedir $share=$share"
$cmd &
Run Code Online (Sandbox Code Playgroud)
运行脚本后startserv.sh,它停止(结束?)而不显示任何提示,然后:
CTRL+C结束脚本和后台作业进程;
点击Enter脚本结束该过程保留在后台。
无论如何,我只能通过ps而不能看到它jobs,所以,当我想关闭进程时,我必须发送一个残酷的kill -9信号,这是我想避免的事情,以支持 CTRL+ C。
另一种方法 是在后台运行整个脚本。'Would be',但read如果脚本作为startserv.sh &.
请注意,我需要一个临时服务器,而不是真正的守护进程:也就是说,我希望服务器进程在脚本结束后在后台运行,以执行简单的交互式 shell 任务(使用虚拟机来宾),但我不不需要进程在 shell 中存活;因此nohup似乎不合适。
command-line signals job-control shell-script background-process
我知道这个问题并不晦涩,因为它在这里被问到不断更新(并在此处重复)。
我想要实现的目标有点不同。我不喜欢每次ls键入时提示重写文件的想法( history -a; history -c; history -r)。
我想在退出时更新文件。这很容易(实际上,默认),但您需要追加而不是重写:
shopt -s histappend
Run Code Online (Sandbox Code Playgroud)
现在,当终端关闭时,我想让所有其他保持打开状态的终端都知道更新。
我更喜欢这样做而不检查我输入的$PS1每一个command。我认为捕获某种信号会更好。你会怎么做?如果不可能,也许是一个简单的cronjob?
我们如何解决这个难题?
如果我运行这些命令:
dmesg | head -n 10
Run Code Online (Sandbox Code Playgroud)
我认为操作系统发送回某种信号,dmesg一旦head读取了 10 行。这是如何运作的?这是什么head告诉内核?
这与程序终止不同,因为这是正常的“干净”停止。
signals ×10
bash ×6
shell-script ×3
autocomplete ×1
command-line ×1
fork ×1
java ×1
job-control ×1
kill ×1
pipe ×1
shell ×1
trap ×1
zsh ×1