我有两个正在运行的进程实例。其中之一是“吓坏了!” 和打印错误不停地到标准输出。
我想终止损坏的进程,但我必须确保我不会终止错误的进程。它们几乎是同时启动的,使用top
我可以看到它们使用的内存和 CPU 量大致相同。我似乎找不到任何表明哪个进程表现不佳的内容。
最安全的做法是找出哪个进程/pid 正在写入 STDOUT。
有没有办法做到这一点?
所以我到处都在读这个命令应该终止父进程的所有子进程:
kill -- -$$
Run Code Online (Sandbox Code Playgroud)
在 kill 命令中使用负 ID 会引用一个 PGID,并且从我看到的示例来看,子进程的 PGID 应该是父进程的 PID,但在我的系统中并非如此。
在我的系统上,子脚本的 PGID 与父脚本的 PGID 相同,结果是 bash。
这里发生了什么?示例是错误的还是我的系统设置不同?
我需要实现的是在不终止父进程的情况下终止子进程,因此我不想向父进程所在的 PGID 发送终止信号。
以下是内容/etc/network/interfaces
:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
post-up /etc/network/if-up.d/sshstart
Run Code Online (Sandbox Code Playgroud)
而且sshstart
是在它下面的脚本:
curl something something darkside send a file over ftps in the background &
/usr/bin/autossh -M 0 -f -N -o ServerAliveInterval=15 -o ServerAliveCountMax=3 -R 127.0.0.1:2005:127.0.0.1:22 -R 192.168.1.10:2006:192.168.2.110:1912 -L 127.0.0.1:5249:192.168.1.212:5249 username@17.16.15.2 -p 8080
Run Code Online (Sandbox Code Playgroud)
当机器重新启动时,该curl
命令被执行多次,该文件在 ftp 服务器上结束了 2 或 3 次,当我查看进程时,似乎有多个 autossh 实例正在运行......不知道是不是这样autossh 会做或不做,但肯定 curl 不应该多次上传文件。
我的预感是整个sshstart
脚本运行了多次,但我不明白为什么。
我尝试在启动时搜索有关网络设置过程的详细信息,但我能找到的只是接口文件的语法信息。
有人可以帮忙吗?
谢谢你。
---编辑---
按照下面的建议,我修改了我的接口文件如下(删除了上面的空行):
auto lo
iface lo inet loopback
auto …
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个函数并相信我找到了一个很好的工作示例,但我不了解它背后的所有逻辑。
更具体地说,在“while”行上,有人可以解释什么是测试,什么是测试?什么是 $#(# 不是注释字符吗?)以及 -gt 0 参数是从哪里来的?在 while 手册页中找不到它。
这是示例:
function my_function()
{
while test $# -gt 0
do
$
echo "$1"
shift
done
}
Run Code Online (Sandbox Code Playgroud)
谢谢你。
我有一个从运行环境中收集调试信息的脚本,我需要弄清楚我是否可以保存该信息。
它可以随时调用:
我需要一个可以随时访问所有内容的文件夹。
那已经存在了吗?如果不是,我怎么能让它发生?
由于这是出于调试目的,我不关心安全性,因此在点击 prod 之前将全部删除。
我的问题是,当我开始编写脚本时,我遇到了几个变量作用域问题,这导致了导出几乎所有变量的坏习惯。
现在我的代码已经变得非常大,我正在考虑清理它,其中一部分是删除一堆无用的导出。不幸的是,我不确定我对变量范围的了解是否完整。即使在阅读了有关该主题的几页之后。
我所知道的(希望是对的):
1-导出变量使其内容可用于子shell进程:
export myvar="content"
Run Code Online (Sandbox Code Playgroud)
2-像这样在括号中完成的内容将受到删除导出的影响(据我所知,这是声明/使用子shell的唯一方法):
$(grep "content" <<< $myvar)
Run Code Online (Sandbox Code Playgroud)
3-变量声明没有设置其作用域是全局的:
myvar="content"
Run Code Online (Sandbox Code Playgroud)
4-因为我没有声明任何局部变量,所以我不必担心在我的函数中引起问题:
local myvar="i don't use this"
Run Code Online (Sandbox Code Playgroud)
问题:
1- 继续删除我的代码旁边的无用导出而不是明显的 noobishness 有什么意义吗?
2-如果我继续进行,还有什么我应该注意的可能会受到影响并破坏我的代码吗?还是我的知识有误/不完整?
3- 如果你知道一个写得很好的(和完整的)变量范围参考,请分享链接。
我有一个像这样的脚本:
while :
do
Start_Time=$(date +"%s")
MAIN PROGRAM GOES HERE (CROPPED TO SHORTEN THINGS)
Run_Time=$(( $(date +"%s") - $Start_Time ))
if [[ $Run_Time < $Wait_Time ]]
then
Delay_Time=$(( $Wait_Time - $Run_Time ))
sleep $Delay_Time
else
echo "Delay exceeded"
echo $Run_Time
echo $Wait_Time
fi
done
Run Code Online (Sandbox Code Playgroud)
我的问题是,有时即使运行时间小于等待时间,它也会失败 < 测试
这是上次运行的输出:
Delay exceeded
Run_Time 4
Wait_Time 30
Run Code Online (Sandbox Code Playgroud) shell-script ×4
process ×2
boot ×1
date ×1
debugging ×1
function ×1
open-files ×1
permissions ×1
scripting ×1
stdout ×1
timestamps ×1
trace ×1
variable ×1