首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相同的脚本,相同的权限,一个挂起一个没有,怎么?为什么?

相同的脚本,相同的权限,一个挂起一个没有,怎么?为什么?
EN

Stack Overflow用户
提问于 2019-04-15 12:22:38
回答 2查看 111关注 0票数 2

我也在超级用户上发布了这个问题,这里是: https://superuser.com/questions/1425657/identical-scripts-same-permissions-one-hangs-one-doesnt-how-why。请在你认为这个问题最合适的网站上回答。这将帮助我学习我应该使用的网站。谢谢,

我总是忘记inxi命令的名称,所以不久前我创建了一个名为sysinfo-的bash脚本(请注意末尾的'-‘以区别我的脚本和linux命令sysinfo)。

代码语言:javascript
复制
$ cat ~/scripts/sysinfo- 
#!/bin/bash

# DESCRIPTION
#
# Display system info at the command promp
#

# Main Program
echo -e "#############\n#  inxi -b  #\n#############\n"
/usr/bin/inxi -b
echo -e "############"

当我升级我的系统时,这个脚本停止工作,inxi被升级到3.0.27版本,脚本在到达inxi命令时挂起,必须用CTRL+C杀死

inxi的开发人员建议我把它升级到3.0.33版本,我做到了。不幸的是,升级在运行原始脚本时并没有改变结果。然而,经过一些测试之后,我发现了一些我无法解释的东西:--我的脚本的精确副本--在原始脚本不运行时成功运行!?

代码语言:javascript
复制
jesse@Limbo ~ $ ~/scripts/sysinfo- 
#############
#  inxi -b  #
#############

^C
jesse@Limbo ~ $ cat ~/scripts/sysinfo- > /tmp/inxi.test 
jesse@Limbo ~ $ chmod +x /tmp/inxi.test 
jesse@Limbo ~ $ /tmp/inxi.test 
#############
#  inxi -b  #
#############

System:    Host: Limbo Kernel: 4.15.0-47-generic x86_64 bits: 64 Desktop: Cinnamon 4.0.10 Distro: Linux Mint 19 Tara 
Machine:   Type: Desktop System: MSI product: MS-7823 v: 1.0 serial: <root required> 
           Mobo: MSI model: CSM-H87M-G43 (MS-7823) v: 1.0 serial: <root required> BIOS: American Megatrends v: 1.6 
           date: 02/22/2014 
CPU:       Quad Core: Intel Core i7-4790 type: MT MCP speed: 3879 MHz min/max: 800/4000 MHz 
Graphics:  Device-1: NVIDIA GM107GL [Quadro K2200] driver: nvidia v: 390.116 
           Display: x11 server: X.Org 1.19.6 driver: nvidia unloaded: fbdev,modesetting,nouveau,vesa 
           resolution: 1920x1080~60Hz, 1280x1024~60Hz 
           OpenGL: renderer: Quadro K2200/PCIe/SSE2 v: 4.6.0 NVIDIA 390.116 
Network:   Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 
           Device-2: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 
Drives:    Local Storage: total: 14.44 TiB used: 8.32 TiB (57.7%) 
Info:      Processes: 316 Uptime: 56m Memory: 31.34 GiB used: 4.80 GiB (15.3%) Shell: inxi.test inxi: 3.0.33 
############
jesse@Limbo ~ $ diff ~/scripts/sysinfo- /tmp/inxi.test 
jesse@Limbo ~ $ ls -l ~/scripts/sysinfo- /tmp/inxi.test 
-rwxr-x--- 1 jesse jesse 187 Apr 15 18:46 /home/jesse/scripts/sysinfo-
-rwxr-x--- 1 jesse jesse 187 Apr 15 19:09 /tmp/inxi.test
jesse@Limbo ~ $ md5sum ~/scripts/sysinfo- /tmp/inxi.test 
a1356223d7bacb6d5b6d74cf44d733f2  /home/jesse/scripts/sysinfo-
a1356223d7bacb6d5b6d74cf44d733f2  /tmp/inxi.test

这怎麽可能?

如果这是原始文件的某种形式的破坏,那么diff会不会发现这一点?我该怎么检查这个?

是否可能有某种策略文件是自动创建的,因为我还没有创建,从而阻止了inxi~/scripts脚本中运行?

BIGO!!

代码语言:javascript
复制
jesse@Limbo ~ $ mv /tmp/inxi.test ~/scripts/
jesse@Limbo ~ $ ~/scripts/inxi.test 
#############
#  inxi -b  #
#############

^C

这可能是一项明显的政策吗?

代码语言:javascript
复制
jesse@Limbo ~ $ apparmor_status | grep inxi

没有结果。

我试着把env放在~/scripts/sysinfo-/tmp/inxi.test

代码语言:javascript
复制
#!/bin/bash

# DESCRIPTION
#
# Display system info at the command promp
#

env

# Main Program
echo -e "#############\n#  inxi -b  #\n#############\n"
/usr/bin/inxi -b
echo -e "############"

但是两个脚本的env输出是相同的。

代码语言:javascript
复制
jesse@Limbo ~ $ diff ~/scripts/sysinfo- /tmp/inxi.test
jesse@Limbo ~ $ ~/scripts/sysinfo- > /tmp/sysinfo.output
^C
jesse@Limbo ~ $ /tmp/inxi.test > /tmp/inxi.test.output
jesse@Limbo ~ $ diff /tmp/sysinfo.output /tmp/inxi.test.output 
61a62,75
> System:    Host: Limbo Kernel: 4.15.0-47-generic x86_64 bits: 64 Desktop: Cinnamon 4.0.10 Distro: Linux Mint 19 Tara 
> Machine:   Type: Desktop System: MSI product: MS-7823 v: 1.0 serial: <root required> 
>            Mobo: MSI model: CSM-H87M-G43 (MS-7823) v: 1.0 serial: <root required> BIOS: American Megatrends v: 1.6 
>            date: 02/22/2014 
> CPU:       Quad Core: Intel Core i7-4790 type: MT MCP speed: 1355 MHz min/max: 800/4000 MHz 
> Graphics:  Device-1: NVIDIA GM107GL [Quadro K2200] driver: nvidia v: 390.116 
>            Display: x11 server: X.Org 1.19.6 driver: nvidia unloaded: fbdev,modesetting,nouveau,vesa 
>            resolution: 1920x1080~60Hz, 1280x1024~60Hz 
>            OpenGL: renderer: Quadro K2200/PCIe/SSE2 v: 4.6.0 NVIDIA 390.116 
> Network:   Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 
>            Device-2: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 
> Drives:    Local Storage: total: 14.44 TiB used: 8.32 TiB (57.7%) 
> Info:      Processes: 315 Uptime: 1h 40m Memory: 31.34 GiB used: 4.97 GiB (15.9%) Shell: inxi.test inxi: 3.0.33 
> ############

如您所见,问题不是从~/scripts中运行bash脚本,而是只在从~/scripts中的脚本运行inxi时出现问题。

~/scripts恰好是我的系统上的一个绑定挂载目录。也许这就是问题所在?

宾果!!

代码语言:javascript
复制
jesse@Limbo ~ $ mv ~/scripts/sysinfo- ~/
jesse@Limbo ~ $ ~/sysinfo- 
#############
#  inxi -b  #
#############

System:    Host: Limbo Kernel: 4.15.0-47-generic x86_64 bits: 64 Desktop: Cinnamon 4.0.10 Distro: Linux Mint 19 Tara 
Machine:   Type: Desktop System: MSI product: MS-7823 v: 1.0 serial: <root required> 
           Mobo: MSI model: CSM-H87M-G43 (MS-7823) v: 1.0 serial: <root required> BIOS: American Megatrends v: 1.6 
           date: 02/22/2014 
CPU:       Quad Core: Intel Core i7-4790 type: MT MCP speed: 900 MHz min/max: 800/4000 MHz 
Graphics:  Device-1: NVIDIA GM107GL [Quadro K2200] driver: nvidia v: 390.116 
           Display: x11 server: X.Org 1.19.6 driver: nvidia unloaded: fbdev,modesetting,nouveau,vesa 
           resolution: 1920x1080~60Hz, 1280x1024~60Hz 
           OpenGL: renderer: Quadro K2200/PCIe/SSE2 v: 4.6.0 NVIDIA 390.116 
Network:   Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 
           Device-2: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 
Drives:    Local Storage: total: 14.44 TiB used: 8.33 TiB (57.7%) 
Info:      Processes: 322 Uptime: 1h 52m Memory: 31.34 GiB used: 5.36 GiB (17.1%) Shell: sysinfo- inxi: 3.0.33 
############

但坚持住..。

代码语言:javascript
复制
jesse@Limbo ~ $ mv ~/sysinfo- ~/scripts/
jesse@Limbo ~ $ cp ~/scripts/sysinfo- ~/
jesse@Limbo ~ $ chmod +x ~/sysinfo- 
jesse@Limbo ~ $ ~/sysinfo- 
#############
#  inxi -b  #
#############

^C

嗯?

我将脚本移回绑定挂载的~/scripts目录,然后将它复制(而不是移动)到~/,使新文件可执行,并且.inxi挂了!

当然,这种行为必须来自能够区分文件移动和复制文件的策略。从bash脚本而不是从命令行运行的程序。除了幽灵之外,还能做什么??

代码语言:javascript
复制
jesse@Limbo ~ $ cd ~/scripts/
jesse@Limbo ~/scripts $ inxi -b
System:    Host: Limbo Kernel: 4.15.0-47-generic x86_64 bits: 64 Desktop: Cinnamon 4.0.10 Distro: Linux Mint 19 Tara 
Machine:   Type: Desktop System: MSI product: MS-7823 v: 1.0 serial: <root required> 
           Mobo: MSI model: CSM-H87M-G43 (MS-7823) v: 1.0 serial: <root required> BIOS: American Megatrends v: 1.6 
           date: 02/22/2014 
CPU:       Quad Core: Intel Core i7-4790 type: MT MCP speed: 1500 MHz min/max: 800/4000 MHz 
Graphics:  Device-1: NVIDIA GM107GL [Quadro K2200] driver: nvidia v: 390.116 
           Display: x11 server: X.Org 1.19.6 driver: nvidia unloaded: fbdev,modesetting,nouveau,vesa 
           resolution: 1920x1080~60Hz, 1280x1024~60Hz 
           OpenGL: renderer: Quadro K2200/PCIe/SSE2 v: 4.6.0 NVIDIA 390.116 
Network:   Device-1: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 
           Device-2: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet driver: r8169 
Drives:    Local Storage: total: 14.44 TiB used: 8.33 TiB (57.7%) 
Info:      Processes: 315 Uptime: 2h 01m Memory: 31.34 GiB used: 4.96 GiB (15.8%) Shell: bash inxi: 3.0.33 

我看不出目录权限会有什么影响

代码语言:javascript
复制
jesse@Limbo ~/scripts $ ls -ld /tmp/ ~/scripts/ ~/
drwxr-x--- 194 jesse jesse 20480 Apr 15 20:06 /home/jesse/
drwxrwx---  18 jesse jesse 12288 Apr 15 20:06 /home/jesse/scripts/
drwxrwxrwt  20 root  root  24576 Apr 15 20:32 /tmp/
EN

回答 2

Stack Overflow用户

发布于 2019-08-23 22:06:34

是否有人发现dmidecode、lshw、lspci、lsusb、lsblk或blkid实用程序试图回叫parent_script?不是的。因此,任何UNIX或Linux实用程序都会对parent_script进行回调。不是的。惊喜,更新的因西版本。

inxi开发人员认为,在不熟悉parent_script的情况下对parent_script进行回调是完全正常的。常识是,除非您了解该脚本以及它的行为,否则永远不会对parent_script进行回调。你只是想要一个恶性循环的循环。如果恶性循环继续运行足够长的时间,它可能会填满Linux proc表,或者耗尽所有可用内存。而inxi开发人员使用非常糟糕的假设对inxi进行了根本的更改,并创建了这个场景。

之前的2.x版本的inxi从未在parent_script上执行过回调。我可以想象许多用户或系统管理员在一个月的脚本中使用inxi实用程序来帮助记录他们的服务器。而inxi 2.x是为他们工作的。

inxi实用程序的3.x版本改变了基本行为。现在,inxi将执行对parent_script --版本的调用。inxi开发人员假设parent_script将对--版本参数做出类似的响应.为什么有人会期待--版本回调,而2.x版本的inxi基本行为没有做到这一点?对于cronjob脚本来说,这可能是非常糟糕的。

3.x版本有一个非常基本的变化,它会让许多用户措手不及,使用一个恶性循环的递归循环。我试图让inxi开发人员解释他为什么要改变现有的基本行为,以及parent_script版本提供了什么有用的用途。祝你好运得到答案。

如何重现这个问题

在我的示例中,/home/temp/bin目录驻留在我的路径中。

将这个简单的"dltest“脚本放在您的路径目录中,它将重现问题:

代码语言:javascript
复制
# cat dltest
#!/bin/bash 


# Open another terminal and use ps -ft /dev/pts/? to view the spawned process.

echo -e "\nUsing `tty`.\nSleeping yawn. Taking five seconds...\n" ; sleep 5

echo -e "\nStarting inxi -Ixxx\n"
# for a test use a very basic inxi.
/usr/bin/inxi -Ixxx


$ pwd
/home/temp/bin
$
$ ./dltest 

Using /dev/pts/0.
Sleeping yawn. Taking five seconds...


Starting inxi_3.0.32


Concurrently using another terminal:


$ ps -ft pts/0
UID        PID  PPID  C STIME TTY          TIME CMD
temp      1820  1816  0 11:02 pts/0    00:00:00 bash
temp     13068  1820  0 14:28 pts/0    00:00:00 /bin/bash ./dltest
temp     13070 13068  0 14:28 pts/0    00:00:00 sleep 5
$ ps -ft pts/0
UID        PID  PPID  C STIME TTY          TIME CMD
temp      1820  1816  0 11:02 pts/0    00:00:00 bash
temp     13068  1820  0 14:28 pts/0    00:00:00 /bin/bash ./dltest
temp     13072 13068 18 14:29 pts/0    00:00:00 /usr/bin/perl /usr/bin/inxi
temp     13081 13072  0 14:29 pts/0    00:00:00 sh -c /home/temp/bin/dltest --version 2>/dev/null
temp     13082 13081  0 14:29 pts/0    00:00:00 /bin/bash /home/temp/bin/dltest --version
temp     13084 13082  0 14:29 pts/0    00:00:00 sleep 5

# The longer it runs the deeper it will get.

$ ps -ft pts/0
UID        PID  PPID  C STIME TTY          TIME CMD
temp      1820  1816  0 11:02 pts/0    00:00:00 bash
temp     13622  1820  0 14:48 pts/0    00:00:00 /bin/bash ./dltest
temp     13625 13622  1 14:48 pts/0    00:00:00 /usr/bin/perl /usr/bin/inxi -tty -Ixxx
temp     13634 13625  0 14:48 pts/0    00:00:00 sh -c /home/temp/bin/dltest --version 2>/dev/null
temp     13635 13634  0 14:48 pts/0    00:00:00 /bin/bash /home/temp/bin/dltest --version
temp     13638 13635  1 14:48 pts/0    00:00:00 /usr/bin/perl /usr/bin/inxi -tty -Ixxx
temp     13647 13638  0 14:48 pts/0    00:00:00 sh -c /home/temp/bin/dltest --version 2>/dev/null
temp     13648 13647  0 14:48 pts/0    00:00:00 /bin/bash /home/temp/bin/dltest --version
temp     13652 13648  2 14:48 pts/0    00:00:00 /usr/bin/perl /usr/bin/inxi -tty -Ixxx
temp     13661 13652  0 14:48 pts/0    00:00:00 sh -c /home/temp/bin/dltest --version 2>/dev/null
temp     13662 13661  0 14:48 pts/0    00:00:00 /bin/bash /home/temp/bin/dltest --version
temp     13665 13662 20 14:48 pts/0    00:00:00 /usr/bin/perl /usr/bin/inxi -tty -Ixxx
temp     13674 13665  0 14:48 pts/0    00:00:00 sh -c /home/temp/bin/dltest --version 2>/dev/null
temp     13675 13674  0 14:48 pts/0    00:00:00 /bin/bash /home/temp/bin/dltest --version
temp     13677 13675  0 14:48 pts/0    00:00:00 sleep 5
temp@lm19:~$ 

为了防止这种恶性循环,您可以在脚本的顶部添加此解决方案。

代码语言:javascript
复制
if [[ "${1}" == "--version" ]] ; then
    # work around for inxi_3.0.32 parent --version anomaly
    exit 1
fi
票数 2
EN

Stack Overflow用户

发布于 2020-12-20 15:49:15

您可以创建一个新脚本,该脚本首先创建原始脚本的临时副本,然后为您运行临时脚本。

因此,您可以将脚本命名为~/scripts/sysinfo2,它看起来如下所示:

代码语言:javascript
复制
#!/bin/bash
cat $HOME/scripts/sysinfo- > /tmp/inxi.test
chmod +x /tmp/inxi.test
/tmp/inxi.test

不要忘记让它可执行:chmod +x ~/scripts/sysinfo2,然后您可以运行

代码语言:javascript
复制
~/scripts/sysinfo2

它应该不挂掉就执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55689120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档