分类 技术 下的文章

有几个有趣的命令可以在 Linux 系统下做数学运算: exprfactorjotbc 命令。

可以在 Linux 命令行下做数学运算吗?当然可以!事实上,有不少命令可以轻松完成这些操作,其中一些甚至让你大吃一惊。让我们来学习这些有用的数学运算命令或命令语法吧。

expr

首先,对于在命令行使用命令进行数学运算,可能最容易想到、最常用的命令就是 expr 表达式 expression 。它可以完成四则运算,也可以用于比较大小。下面是几个例子:

变量递增

$ count=0
$ count=`expr $count + 1`
$ echo $count
1

完成简单运算

$ expr 11 + 123
134
$ expr 134 / 11
12
$ expr 134 - 11
123
$ expr 11 * 123
expr: syntax error      <== oops!
$ expr 11 \* 123
1353
$ expr 20 % 3
2

注意,你需要在 * 运算符之前增加 \ 符号,避免语法错误(注:* 是 bash 的通配符,因此需要用 \ 转义,下面的 > 也是由于是 bash 的管道符而需要转义)。% 运算符用于取余运算。

下面是一个稍微复杂的例子:

participants=11
total=156
share=`expr $total / $participants`
remaining=`expr $total - $participants \* $share`
echo $share
14
echo $remaining
2

假设某个活动中有 11 位参与者,需要颁发的奖项总数为 156,那么平均每个参与者获得 14 项奖项,额外剩余 2 个奖项。

比较

下面让我们看一下比较的操作。从第一印象来看,语句看似有些怪异;这里并不是设置数值,而是进行数字比较。在本例中 expr 判断表达式是否为真:如果结果是 1,那么表达式为真;反之,表达式为假。

$ expr 11 = 11
1
$ expr 11 = 12
0

请读作“11 是否等于 11?”及“11 是否等于 12?”,你很快就会习惯这种写法。当然,我们不会在命令行上执行上述比较,可能的比较是 $age 是否等于 11

$ age=11
$ expr $age = 11
1

在本例中,我们判断 10 是否大于 5,以及是否大于 99。

$ expr 10 \> 5
1
$ expr 10 \> 99
0

的确,返回 1 和 0 分别代表比较的结果为真和假,我们一般预期在 Linux 上得到这个结果。在下面的例子中,按照上述逻辑使用 expr 并不正确,因为 if 的工作原理刚好相反,即 0 代表真。

#!/bin/bash

echo -n "Cost to us> "
read cost
echo -n "Price we're asking> "
read price

if [ `expr $price \> $cost` ]; then
 echo "We make money"
else
 echo "Don't sell it"
fi

下面,我们运行这个脚本:

$ ./checkPrice
Cost to us> 11.50
Price we're asking> 6
We make money

这显然与我们预期不符!我们稍微修改一下,以便使其按我们预期工作:

#!/bin/bash

echo -n "Cost to us> "
read cost
echo -n "Price we're asking> "
read price

if [ `expr $price \> $cost` == 1 ]; then
 echo "We make money"
else
 echo "Don't sell it"
fi

factor

factor 命令的功能基本与你预期相符。你给出一个数字,该命令会给出对应数字的因子。

$ factor 111
111: 3 37
$ factor 134
134: 2 67
$ factor 17894
17894: 2 23 389
$ factor 1987
1987: 1987

注:factor 命令对于最后一个数字没有返回更多因子,这是因为 1987 是一个质数

jot

jot 命令可以创建一系列数字。给定数字总数及起始数字即可。

$ jot 8 10
10
11
12
13
14
15
16
17

你也可以用如下方式使用 jot,这里我们要求递减至数字 2。

$ jot 8 10 2
10
9
8
7
5
4
3
2

jot 可以帮你构造一系列数字组成的列表,该列表可以用于其它任务。

$ for i in `jot 7 17`; do echo April $i; done
April 17
April 18
April 19
April 20
April 21
April 22
April 23

bc

bc 基本上是命令行数学运算最佳工具之一。输入你想执行的运算,使用管道发送至该命令即可:

$ echo "123.4+5/6-(7.89*1.234)" | bc
113.664

可见 bc 并没有忽略精度,而且输入的字符串也相当直截了当。它还可以进行大小比较、处理布尔值、计算平方根、正弦、余弦和正切等。

$ echo "sqrt(256)" | bc
16
$ echo "s(90)" | bc -l
.89399666360055789051

事实上,bc 甚至可以计算 pi。你需要指定需要的精度。

$ echo "scale=5; 4*a(1)" | bc -l
3.14156
$ echo "scale=10; 4*a(1)" | bc -l
3.1415926532
$ echo "scale=20; 4*a(1)" | bc -l
3.14159265358979323844
$ echo "scale=40; 4*a(1)" | bc -l
3.1415926535897932384626433832795028841968

除了通过管道接收数据并返回结果,bc还可以交互式运行,输入你想执行的运算即可。本例中提到的 scale 设置可以指定有效数字的个数。

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
scale=2
3/4
.75
2/3
.66
quit

你还可以使用 bc 完成数字进制转换。obase 用于设置输出的数字进制。

$ bc
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
obase=16
16      <=== entered
10      <=== response
256     <=== entered
100     <=== response
quit

按如下方式使用 bc 也是完成十六进制与十进制转换的最简单方式之一:

$ echo "ibase=16; F2" | bc
242
$ echo "obase=16; 242" | bc
F2

在上面第一个例子中,我们将输入进制(ibase)设置为十六进制(hex),完成十六进制到为十进制的转换。在第二个例子中,我们执行相反的操作,即将输出进制(obase)设置为十六进制。

简单的 bash 数学运算

通过使用双括号,我们可以在 bash 中完成简单的数学运算。在下面的例子中,我们创建一个变量,为变量赋值,然后依次执行加法、自减和平方。

$ (( e = 11 ))
$ (( e = e + 7 ))
$ echo $e
18

$ (( e-- ))
$ echo $e
17

$ (( e = e ** 2 ))
$ echo $e
289

允许使用的运算符包括:

+ -     加法及减法
++ --   自增与自减
* / %   乘法、除法及求余数
**      指数运算(bash 中)
^       指数运算(bc 中)

你还可以使用逻辑运算符和布尔运算符:

$ ((x=11)); ((y=7))
$ if (( x > y )); then
> echo "x > y"
> fi
x > y

$ ((x=11)); ((y=7)); ((z=3))
$ if (( x > y )) >> (( y > z )); then
> echo "letters roll downhill"
> fi
letters roll downhill

或者如下方式:

$ if [ x > y ] << [ y > z ]; then echo "letters roll downhill"; fi
letters roll downhill

下面计算 2 的 3 次幂:

$ echo "2 ^ 3"
2 ^ 3
$ echo "2 ^ 3" | bc
8

总结

在 Linux 系统中,有很多不同的命令行工具可以完成数字运算。希望你在读完本文之后,能掌握一两个新工具。

感谢 @no1xsyzy 提出的修改意见


via: https://www.networkworld.com/article/3268964/linux/how-to-do-math-on-the-linux-command-line.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:pinewall 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

有个简单实用的技巧可以让你的 bash 脚本更稳健 -- 确保总是执行必要的收尾工作,哪怕是在发生异常的时候。要做到这一点,秘诀就是 bash 提供的一个叫做 EXIT 的伪信号,你可以 trap 它,当脚本因为任何原因退出时,相应的命令或函数就会执行。我们来看看它是如何工作的。

基本的代码结构看起来像这样:

#!/bin/bash
function finish {
  # 你的收尾代码
}
trap finish EXIT

你可以把任何你觉得务必要运行的代码放在这个 finish 函数里。一个很好的例子是:创建一个临时目录,事后再删除它。

#!/bin/bash
scratch=$(mktemp -d -t tmp.XXXXXXXXXX)
function finish {
  rm -rf "$scratch"
}
trap finish EXIT

这样,在你的核心代码中,你就可以在这个 $scratch 目录里下载、生成、操作中间或临时数据了。 注1

# 下载所有版本的 linux 内核…… 为了科学研究!
for major in {1..4}; do
  for minor in {0..99}; do
    for patchlevel in {0..99}; do
      tarball="linux-${major}-${minor}-${patchlevel}.tar.bz2"
      curl -q "http://kernel.org/path/to/$tarball" -o "$scratch/$tarball" || true
      if [ -f "$scratch/$tarball" ]; then
        tar jxf "$scratch/$tarball"
      fi
    done
  done
done
# 整合成单个文件
# 复制到目标位置
cp "$scratch/frankenstein-linux.tar.bz2" "$1"
# 脚本结束, scratch 目录自动被删除

比较一下如果不用 trap ,你是怎么删除 scratch 目录的:

#!/bin/bash
# 别这样做!

scratch=$(mktemp -d -t tmp.XXXXXXXXXX)

# 在这里插入你的几十上百行代码

# 都搞定了,退出之前把目录删除
rm -rf "$scratch"

这有什么问题么?很多:

  • 如果运行出错导致脚本提前退出, scratch 目录及里面的内容不会被删除。这会导致资料泄漏,可能引发安全问题。
  • 如果这个脚本的设计初衷就是在脚本末尾以前退出,那么你必须手动复制粘贴 rm 命令到每一个出口。
  • 这也给维护带来了麻烦。如果今后在脚本某处添加了一个 exit ,你很可能就忘了加上删除操作 -- 从而制造潜在的安全漏洞。

无论如何,服务要在线

另外一个场景: 想象一下你正在运行一些自动化系统运维任务,要临时关闭一项服务,最后这项服务需要重启,而且要万无一失,即使脚本运行出错。那么你可以这样做:

function finish {
    # 重启服务
    sudo /etc/init.d/something start
}
trap finish EXIT
sudo /etc/init.d/something stop
# 主要任务代码

# 脚本结束,执行 finish 函数重启服务

一个具体的实例:比如 Ubuntu 服务器上运行着 MongoDB ,你要为 crond 写一个脚本来临时关闭服务并做一些日常维护工作。你应该这样写:

function finish {
    # 重启服务
    sudo service mongdb start
}
trap finish EXIT
# 关闭 mongod 服务
sudo service mongdb stop
# (如果 mongod 配置了 fork ,比如 replica set ,你可能需要执行 “sudo killall --wait /usr/bin/mongod”)

控制开销

有一种情况特别能体现 EXIT trap 的价值:如果你的脚本运行过程中需要初始化一下成本高昂的资源,结束时要确保把它们释放掉。比如你在 AWS (Amazon Web Services) 上工作,要在脚本中创建一个镜像。

(名词解释: 在亚马逊云上的运行的服务器叫“实例”。实例从 亚马逊机器镜像 Amazon Machine Image 创建而来,通常被称为 “AMI” 或 “镜像” 。AMI 相当于某个特殊时间点的服务器快照。)

我们可以这样创建一个自定义的 AMI :

  1. 基于一个基准 AMI 运行一个实例(例如,启动一个服务器)。
  2. 在实例中手动或运行脚本来做一些修改。
  3. 用修改后的实例创建一个镜像。
  4. 如果不再需要这个实例,可以将其删除。

最后一步相当重要。如果你的脚本没有把实例删除掉,它会一直运行并计费。(到月底你的账单让你大跌眼镜时,恐怕哭都来不及了!)

如果把 AMI 的创建封装在脚本里,我们就可以利用 trap EXIT 来删除实例了。我们还可以用上 EC2 的命令行工具:

#!/bin/bash
# 定义基准 AMI 的 ID
ami=$1
# 保存临时实例的 ID
instance=''
# 作为 IT 人,让我们看看 scratch 目录的另类用法
scratch=$(mktemp -d -t tmp.XXXXXXXXXX)
function finish {
    if [ -n "$instance" ]; then
        ec2-terminate-instances "$instance"
    fi
    rm -rf "$scratch"
}
trap finish EXIT
# 创建实例,将输出(包含实例 ID )保存到 scratch 目录下的文件里
ec2-run-instances "$ami" > "$scratch/run-instance"
# 提取实例 ID
instance=$(grep '^INSTANCE' "$scratch/run-instance" | cut -f 2)

脚本执行到这里,实例(EC2 服务器)已经开始运行 注2 。接下来你可以做任何事情:在实例中安装软件,修改配置文件等,然后为最终版本创建一个镜像。实例会在脚本结束时被删除 -- 即使脚本因错误而提前退出。(请确保实例创建成功后再运行业务代码。)

更多应用

这篇文章只讲了些皮毛。我已经使用这个 bash 技巧很多年了,现在还能不时发现一些有趣的用法。你也可以把这个方法应用到你自己的场景中,从而提升你的 bash 脚本的可靠性。

尾注

  • 注1. mktemp 的选项 -t 在 Linux 上是可选的,在 OS X 上是必需的。带上此选项可以让你的脚本有更好的可移植性。
  • 注2. 如果只是为了获取实例 ID ,我们不用创建文件,直接写成 instance=$(ec2-run-instances "$ami" | grep '^INSTANCE' | cut -f 2) 就可以。但把输出写入文件可以记录更多有用信息,便于调试 ,代码可读性也更强。

作者简介:美国加利福尼亚旧金山的作家,软件工程师,企业家。Powerful Python 的作者,他的 blog


via: http://redsymbol.net/articles/bash-exit-traps/

作者:aaron maxwell 译者:Dotcra 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Java 是世界上最流行的编程语言之一。它广泛用于开发物联网设备、Android 程序、Web 和企业应用。本文将提供使用 OpenJDK 安装和配置工作站的指南。

安装编译器和工具

在 Fedora 中安装编译器或 Java Development Kit(JDK)很容易。在写这篇文章时,可以用 v8 和 v9 版本。只需打开一个终端并输入:

sudo dnf install java-1.8.0-openjdk-devel

这安装 JDK v8。对于 v9,请输入:

sudo dnf install java-9-openjdk-devel

对于需要其他工具和库(如 Ant 和 Maven)的开发人员,可以使用 Java Development 组。要安装套件,请输入:

sudo dnf group install "Java Development"

要验证编译器是否已安装,请运行:

javac -version

输出显示编译器版本,如下所示:

javac 1.8.0_162

编译程序

你可以使用任何基本的文本编辑器(如 nano、vim 或 gedit)编写程序。这个例子提供了一个简单的 “Hello Fedora” 程序。

打开你最喜欢的文本编辑器并输入以下内容:

public class HelloFedora {

      public static void main (String[] args) {
              System.out.println("Hello Fedora!");
      }
}

将文件保存为 HelloFedora.java。在终端切换到包含该文件的目录并执行以下操作:

javac HelloFedora.java

如果编译器遇到任何语法错误,它会发出错误。否则,它只会在下面显示 shell 提示符。

你现在应该有一个名为 HelloFedora 的文件,它是编译好的程序。使用以下命令运行它:

java HelloFedora

输出将显示:

Hello Fedora!

安装集成开发环境(IDE)

有些程序可能更复杂,IDE 可以帮助顺利进行。Java 程序员有很多可用的 IDE,其中包括:

然而,主要用 Java 编写的最流行的开源 IDE 之一是 Eclipse。 Eclipse 在官方仓库中有。要安装它,请运行以下命令:

sudo dnf install eclipse-jdt

安装完成后,Eclipse 的快捷方式会出现在桌面菜单中。

有关如何使用 Eclipse 的更多信息,请参阅其网站上的用户指南

浏览器插件

如果你正在开发 Web 小程序并需要一个用于浏览器的插件,则可以使用 IcedTea-Web。像 OpenJDK 一样,它是开源的并易于在 Fedora 中安装。运行这个命令:

sudo dnf install icedtea-web

从 Firefox 52 开始,Web 插件不再有效。有关详细信息,请访问 Mozilla 支持网站 https://support.mozilla.org/en-US/kb/npapi-plugins?as=u&utm_source=inproduct

恭喜,你的 Java 开发环境已准备完毕。


via: https://fedoramagazine.org/start-developing-java-fedora/

作者:Shaun Assam 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

shuf 命令用于在类 Unix 操作系统中生成随机排列。使用 shuf 命令,我们可以随机打乱给定输入文件的行。shuf 命令是 GNU Coreutils 的一部分,因此你不必担心安装问题。在这个简短的教程中,让我向你展示一些 shuf 命令的例子。

带例子的 shuf 命令教程

我有一个名为 ostechnix.txt 的文件,内容如下:

$ cat ostechnix.txt
line1
line2
line3
line4
line5
line6
line7
line8
line9
line10

现在让我们以随机顺序显示上面的行。为此,请运行:

$ shuf ostechnix.txt
line2
line8
line5
line10
line7
line1
line4
line6
line9
line3

看到了吗?上面的命令将名为 ostechnix.txt 中的行随机排列并输出了结果。

你可能想将输出写入另一个文件。例如,我想将输出保存到 output.txt 中。为此,请先创建 output.txt

$ touch output.txt

然后,像下面使用 -o 标志将输出写入该文件:

$ shuf ostechnix.txt -o output.txt

上面的命令将随机随机打乱 ostechnix.txt 的内容并将输出写入 output.txt。你可以使用命令查看 output.txt 的内容:

$ cat output.txt

line2
line8
line9
line10
line1
line3
line7
line6
line4
line5

我只想显示文件中的任意一行。我该怎么做?很简单!

$ shuf -n 1 ostechnix.txt
line6

同样,我们可以选择前 “n” 个随机条目。以下命令将只显示前五个随机条目:

$ shuf -n 5 ostechnix.txt
line10
line4
line5
line9
line3

如下所示,我们可以直接使用 -e 标志传入输入,而不是从文件中读取行:

$ shuf -e line1 line2 line3 line4 line5
line1
line3
line5
line4
line2

你也可以传入数字:

$ shuf -e 1 2 3 4 5
3
5
1
4
2

要快速在给定范围选择一个,请改用此命令:

$ shuf -n 1 -e 1 2 3 4 5

或者,选择下面的任意三个随机数字:

$ shuf -n 3 -e 1 2 3 4 5
3
5
1

我们也可以在特定范围内生成随机数。例如,要显示 1 到 10 之间的随机数,只需使用:

$ shuf -i 1-10
1
9
8
2
4
7
6
3
10
5

有关更多详细信息,请参阅手册页。

$ man shuf

今天就是这些。还有更多更好的东西。敬请关注!

干杯!


via: https://www.ostechnix.com/the-shuf-command-tutorial-with-examples-for-beginners/

作者:SK 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

全局变量

在 Python 中,在函数之外或在全局范围内声明的变量被称为全局变量。 这意味着,全局变量可以在函数内部或外部访问。

我们来看一个关于如何在 Python 中创建一个全局变量的示例。

示例 1:创建全局变量

x = "global"

def foo():
    print("x inside :", x)

foo()
    print("x outside:", x)

当我们运行代码时,将会输出:

x inside : global
x outside: global

在上面的代码中,我们创建了 x 作为全局变量,并定义了一个 foo() 来打印全局变量 x。 最后,我们调用 foo() 来打印x的值。

倘若你想改变一个函数内的 x 的值该怎么办?

x = "global"

def foo():
    x = x * 2
    print(x)
foo()

当我们运行代码时,将会输出:

UnboundLocalError: local variable 'x' referenced before assignment

输出显示一个错误,因为 Python 将 x 视为局部变量,而 x 没有在 foo() 内部定义。

为了运行正常,我们使用 global 关键字,查看 PythonGlobal 关键字以便了解更多。

局部变量

在函数体内或局部作用域内声明的变量称为局部变量。

示例 2:访问作用域外的局部变量

def foo():
    y = "local"

foo()
print(y)

当我们运行代码时,将会输出:

NameError: name 'y' is not defined

输出显示了一个错误,因为我们试图在全局范围内访问局部变量 y,而局部变量只能在 foo() 函数内部或局部作用域内有效。

我们来看一个关于如何在 Python 中创建一个局部变量的例子。

示例 3:创建一个局部变量

通常,我们在函数内声明一个变量来创建一个局部变量。

def foo():
    y = "local"
    print(y)

foo()

当我们运行代码时,将会输出:

local

让我们来看看前面的问题,其中x是一个全局变量,我们想修改 foo() 内部的 x

全局变量和局部变量

在这里,我们将展示如何在同一份代码中使用全局变量和局部变量。

示例 4:在同一份代码中使用全局变量和局部变量

x = "global"

def foo():
    global x
    y = "local"
    x = x * 2
    print(x)
    print(y)

foo()

当我们运行代码时,将会输出(LCTT 译注:原文中输出结果的两个 global 有空格,正确的是没有空格):

globalglobal
local

在上面的代码中,我们将 x 声明为全局变量,将 y 声明为 foo() 中的局部变量。 然后,我们使用乘法运算符 * 来修改全局变量 x,并打印 xy

在调用 foo() 之后,x 的值变成 globalglobal了(LCTT 译注:原文同样有空格,正确的是没有空格),因为我们使用 x * 2 打印两次 global。 之后,我们打印局部变量y的值,即 local

示例 5:具有相同名称的全局变量和局部变量

x = 5

def foo():
    x = 10
    print("local x:", x)

foo()
print("global x:", x)

当我们运行代码时,将会输出:

local x: 10
global x: 5

在上面的代码中,我们对全局变量和局部变量使用了相同的名称 x。 当我们打印相同的变量时却得到了不同的结果,因为这两个作用域内都声明了变量,即 foo() 内部的局部作用域和 foo() 外面的全局作用域。

当我们在 foo() 内部打印变量时,它输出 local x: 10,这被称为变量的局部作用域。

同样,当我们在 foo() 外部打印变量时,它输出 global x: 5,这被称为变量的全局作用域。

非局部变量

非局部变量用于局部作用域未定义的嵌套函数。 这意味着,变量既不能在局部也不能在全局范围内。

我们来看一个关于如何在 Python 中创建一个非局部变量的例子。(LCTT 译者注:原文为创建全局变量,疑为笔误)

我们使用 nonlocal 关键字来创建非局部变量。

示例 6:创建一个非局部变量

def outer():
    x = "local"

    def inner():
        nonlocal x
        x = "nonlocal"
        print("inner:", x)

    inner()
    print("outer:", x)

outer()

当我们运行代码时,将会输出:

inner: nonlocal
outer: nonlocal

在上面的代码中有一个嵌套函数 inner()。 我们使用 nonlocal 关键字来创建非局部变量。inner() 函数是在另一个函数 outer() 的作用域中定义的。

注意:如果我们改变非局部变量的值,那么变化就会出现在局部变量中。


via: https://www.programiz.com/python-programming/global-local-nonlocal-variables

作者:programiz 译者:Flowsnow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

我知道熬夜对健康不利。但谁在乎?多年来我一直是一只夜猫子。我通常在 12 点以后睡觉,有时在凌晨 1 点以后睡觉。第二天早上,我至少推迟三次闹钟,醒来后又累又有脾气。每天,我向自己保证早点睡觉,但最终会像平常一样晚睡。而且,这个循环还在继续!如果你和我一样,这有一个好消息。一个同学通宵开发了一个名为 “Kgotobed” 的内核模块,它迫使你在特定的时间上床睡觉。也就是说它会强制关闭你的系统。

你可能会问!我为什么要用这个?我有很多其他的选择。我可以设置一个 cron 作业来安排在特定时间关闭系统。我可以设置提醒或闹钟。我可以使用浏览器插件或软件。但是,它们都可以轻易忽略或绕过。Kgotobed 是你不能忽视的东西。即使您是 root 用户也无法禁用。是的,它会在指定的时间强制关闭你的系统。没有推迟选项。你不能推迟关机过程,也不能取消它。无论如何,系统都会在指定的时间停止运行。你被警告了!!

安装 Kgotobed

确保你已经安装了 dkms。它在大多数 Linux 发行版的默认仓库中都有。

例如在 Fedora 上,你可以使用以下命令安装它:

$ sudo dnf install kernel-devel-$(uname -r) dkms

在 Debian、Ubuntu、linux Mint 上:

$ sudo apt install dkms

安装完成后,git clone Kgotobed 项目。

$ git clone https://github.com/nikital/kgotobed.git

该命令会在当前工作目录中将所有 Kgotobed 仓库的内容克隆到名为 kgotobed 的文件夹中。进入到该目录:

$ cd kgotobed/

接着,使用命令安装 Kgotobed 驱动:

$ sudo make install

上面的命令将 kgotobed.ko 模块注册到 DKMS(这样它会为每个你运行的内核重建)并在 /usr/local/bin/ 目录下安装 gotobed,然后注册、启用并启动 kgotobed 服务。

如何运行

默认情况下,Kgotobed 将睡前时间设置为 1:00 AM。也就是说,无论你在做什么,你的电脑都会在凌晨 1 点关机。

要查看当前的睡前时间,请运行:

$ gotobed
Current bedtime is 2018-04-10 01:00:00

要提前睡眠时间,例如 22:00(晚上 10 点),请运行:

$ sudo gotobed 22:00
[sudo] password for sk:
Current bedtime is 2018-04-10 00:58:00
Setting bedtime to 2018-04-09 22:00:00
Bedtime will be in 2 hours 16 minutes

当你想早点睡觉时,这会很有帮助!

但是,你不能设置更晚的时间也就是凌晨 1 点以后。你无法卸载模块,并且调整系统时钟也无济于事。唯一的出路是重启!

要设置不同的默认时间,您需要自定义 kgotobed.service(通过编辑或使用 systemd 工具)。

卸载 Kgotobed

对 Kgotobed 不满意?别担心!进入我们先前克隆的 kgotobed 文件夹,然后运行以下命令将其卸载。

$ sudo make uninstall

再一次,我警告你,即使你是 root 用户,也没有办法推迟或取消关机过程。你的系统将在指定的时间强制关闭。这并不适合每个人!当你在做一项重要任务时,它可能会让你疯狂。在这种情况下,请确保你已经不时地保存工作,或使用下面链接中的一些高级工具来帮助你在特定时间自动关闭、重启、暂停和休眠系统。

就是这些了。希望你觉得这个指南有帮助。还有更好的东西。敬请关注!

干杯!

资源


via: https://www.ostechnix.com/kgotobed-a-kernel-module-that-forcibly-shutdown-your-system/

作者:SK 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出