小编TCZ*_*CZ8的帖子

如何找出正在写入 STDOUT 的进程?

我有两个正在运行的进程实例。其中之一是“吓坏了!” 和打印错误不停地到标准输出。

我想终止损坏的进程,但我必须确保我不会终止错误的进程。它们几乎是同时启动的,使用top我可以看到它们使用的内存和 CPU 量大致相同。我似乎找不到任何表明哪个进程表现不佳的内容。

最安全的做法是找出哪个进程/pid 正在写入 STDOUT。

有没有办法做到这一点?

process debugging open-files trace stdout

21
推荐指数
2
解决办法
4755
查看次数

为什么我的子进程的 PGID 不是父进程的 PID?

所以我到处都在读这个命令应该终止父进程的所有子进程:

kill -- -$$
Run Code Online (Sandbox Code Playgroud)

在 kill 命令中使用负 ID 会引用一个 PGID,并且从我看到的示例来看,子进程的 PGID 应该是父进程的 PID,但在我的系统中并非如此。

在我的系统上,子脚本的 PGID 与父脚本的 PGID 相同,结果是 bash。

这里发生了什么?示例是错误的还是我的系统设置不同?

我需要实现的是在不终止父进程的情况下终止子进程,因此我不想向父进程所在的 PGID 发送终止信号。

process shell-script process-groups

14
推荐指数
1
解决办法
2万
查看次数

为什么 /etc/network/interfaces 中的 post-up 命令在启动时多次运行?

以下是内容/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)

boot networkmanager network-interface

12
推荐指数
1
解决办法
5万
查看次数

“while test $# -gt 0”有什么作用?

我正在尝试创建一个函数并相信我找到了一个很好的工作示例,但我不了解它背后的所有逻辑。

更具体地说,在“while”行上,有人可以解释什么是测试,什么是测试?什么是 $#(# 不是注释字符吗?)以及 -gt 0 参数是从哪里来的?在 while 手册页中找不到它。

这是示例:

function my_function()
{
while test $# -gt 0
do
    $
echo "$1"
    shift
done
}
Run Code Online (Sandbox Code Playgroud)

谢谢你。

shell-script function

8
推荐指数
2
解决办法
2万
查看次数

是否有一个文件夹可供所有进程和用户随时访问?

我有一个从运行环境中收集调试信息的脚本,我需要弄清楚我是否可以保存该信息。

它可以随时调用:

  • 开机时
  • 系统运行时
  • 在关机等...
  • 以及任何用户或流程/服务。

我需要一个可以随时访问所有内容的文件夹。

那已经存在了吗?如果不是,我怎么能让它发生?
由于这是出于调试目的,我不关心安全性,因此在点击 prod 之前将全部删除。

permissions directory-structure

6
推荐指数
2
解决办法
1万
查看次数

如果我从变量中删除导出,还有什么会中断?

我的问题是,当我开始编写脚本时,我遇到了几个变量作用域问题,这导致了导出几乎所有变量的坏习惯。

现在我的代码已经变得非常大,我正在考虑清理它,其中一部分是删除一堆无用的导出。不幸的是,我不确定我对变量范围的了解是否完整。即使在阅读了有关该主题的几页之后。

我所知道的(希望是对的):

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- 如果你知道一个写得很好的(和完整的)变量范围参考,请分享链接。

shell-script environment-variables variable

5
推荐指数
1
解决办法
482
查看次数

如何测试小于其他数字的数字

我有一个像这样的脚本:

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)

scripting shell-script date timestamps

2
推荐指数
1
解决办法
1239
查看次数