【问题标题】:how to create static program or process in linux?如何在linux中创建静态程序或进程?
【发布时间】:2019-05-17 17:37:23
【问题描述】:

就像c中函数的静态变量提供的功能一样。 在 bash 脚本中多次调用程序时,必须将上一次调用的数据保留到下一次调用。 通常,当我们在 bash 中运行程序时,它会在完成后终止。

我想要的是当程序运行时,它不能自行终止并继续运行,直到调用 kill 命令显式终止。 这样我们就可以同时调用要使用的程序。

【问题讨论】:

  • 看看coprocesses
  • 如果你不想让程序终止,那么就不要让它结束。例如,调用一个将无限期阻塞的函数,或者至少直到某个适当的稍后时间。有很多可能性,但如果使用得当,sigsuspend() 是一个相当不错的选择。这甚至适用于您使用kill 来阻止它的特定选择。
  • 还有用于程序和脚本的静态变量:它们被称为“文件”。
  • 完全不清楚你的意思。也许您想实现一个可以长时间运行的守护程序,您可以多次查询。或者您可能想使用 sqlite 数据库。或者,也许您只是想生成一些数据并将其写入文件系统。除非您的意思是“实例化进程的新实例”,否则“继续调用程序”是什么意思?也许您的意思是“继续查询守护进程”、“继续读取文件”或“查询数据库”。
  • @WilliamPursell 所说的。 “同时继续调用要使用的程序”是什么意思?因为从 shell 调用程序会产生一个新进程。可能您想投入精力制作更智能的程序而不是 shell 技巧。

标签: linux bash memory-management process


【解决方案1】:

听起来像这样的东西就是你要找的东西:

$ cat tst.sh
#!/bin/env bash

trap 'echo "No - go away!" >&2' SIGINT
while :; do
    printf '.'
    sleep 5
done

$ ./tst.sh &
[1] 1309
$ ..
$ kill -SIGINT 1309
$ No - go away!
..
$ kill -9 1309
$
[1]+  Killed                  ./tst.sh

我使用陷阱只是为了表明该进程正在运行并且可以与之交互,直到您将其杀死(在这种情况下为 -9)

【讨论】:

  • 不,下次调用同一个程序时,它必须保留上次调用中的数据更改。
  • 那你为什么说what i want is when the program is run, it must not terminate by itself and to keep running until kill command is invoked to terminate explicitly?这正是我的脚本所做的,与next time you call the same program it must retain the data changes in previous call 无关。您的问题非常不清楚。
【解决方案2】:

在bash脚本中多次调用程序时,必须保留上一次调用的数据到下一次调用

这些是我能想到的解决方案

  1. 使用临时文件来存储值。
static_var_file=/tmp/static_var
# or use /usr/tmp/static_var to save it between reboots

# load
static_var=$([ -f "$static_var_file ] && cat "$static_var_file" || echo 0)

# the script here
static_var=$((static_var+1))

# save
echo "$static_var" > "$static_var_file"

  1. 使用自修改脚本
static_var=0  # MARK

# the script here
static_var=$((static_var+1))

# self modify ourselves to store new value
sed '/^static_var=.* # MARK$/s/.*/static_var="'"$static_var"'" # MARK/' "$0"

【讨论】:

  • 我希望数据保留在 RAM 上,而不是辅助存储上。
  • 然后mount -o tmpfs tmpfs /yourdir 并使用该挂载点。在大多数/某些系统上,/tmp 无论如何都安装到tmpfs,所以它是 RAM。它是 linux - 一切都是一个文件。可以肯定 - 我认为你可以使用 /dev/shm
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 1970-01-01
  • 2013-07-31
相关资源
最近更新 更多