我正在用 bash 编写一个 shell 脚本。在脚本的某个时刻,它检测到机器需要重新启动才能继续。它发出:
sudo reboot
Run Code Online (Sandbox Code Playgroud)
当机器重新启动时,这个脚本需要做更多的工作。如何配置某些内容以继续在此脚本中执行工作?
我假设在某个地方可以编写一个 shell 脚本,以便在下次重新启动时执行。哪里有这样的地方?我看到 cron 有一个 @reboot 指令。我也知道诸如 Apache 之类的服务是由 upstart 在启动时启动的。其中任何一个都是合适的机制吗?如果有,如何触发?
这个脚本只需要运行一次,而不是每次重启。因此,它必须在下次重新启动时运行,或者在运行后能够自行删除。
此问题询问如何在重新启动后保存应用程序状态。我的脚本没有太多状态,所以我可以管理它。我只需要知道如何让这个脚本在下次重启后触发一些东西运行。
我的具体版本是 Ubuntu Linux 14.04。原始脚本由系统管理员在命令行上启动(而不是从 cron 运行)。
我想删除当前目录树中的所有文件,除了save
. 我运行了这个命令:
find . \( -name save -prune \) -o -type f -ls | grep /save/
Run Code Online (Sandbox Code Playgroud)
它没有找到。但是当我运行这个命令时:
find . \( -name save -prune \) -o -type f -delete
Run Code Online (Sandbox Code Playgroud)
/save/ 中的所有文件都消失了。我错过了什么?
我有一个命令,它接受一个文件作为参数,修改文件,然后将它写入第二个参数中指定的文件名。我会调用那个程序modifyfile
。
我希望它“就地”工作,所以我编写了一个 shell 脚本 (bash),将它修改为一个临时文件,然后将其移回:
TMP=`mktemp`
modifyfile "$original" "$TMP"
mv -v "$TMP" "$original"
Run Code Online (Sandbox Code Playgroud)
这具有破坏此文件权限的不幸副作用。该文件使用默认权限重新创建。
有没有办法告诉mv
命令在不改变其权限的情况下覆盖目标?或者有没有办法从原始保存用户、组和权限并恢复它们?
我有一个名为“storage”的 ReadyNAS 盒子,我相信它是基于 Debian 的。我可以以 root 身份 ssh 进入它。我正在尝试重新配置网络服务器,但我遇到了一个我不明白的文件权限问题。/etc/frontview/apache/apache.pem
即使是root我也不能做任何事情!与同一目录中的其他文件相比,它似乎没有任何特殊权限,我可以使用这些权限。
storage:~# whoami
root
storage:~# cd /etc/frontview/apache/
storage:/etc/frontview/apache# ls -lah apache.pem*
-rw------- 1 admin admin 4.0k Jul 10 2013 apache.pem
-rw------- 1 admin admin 4.0k Jun 9 05:57 apache.pem.2017-02-04
-rw------- 1 admin admin 1.5k Jun 9 05:57 apache.pem.orig
storage:/etc/frontview/apache# touch apache.pem
touch: creating `apache.pem': Permission denied
storage:/etc/frontview/apache# touch apache.pem.2017-02-04
storage:/etc/frontview/apache# rm -f apache.pem
rm: cannot unlink `apache.pem': Operation not permitted
Run Code Online (Sandbox Code Playgroud)
这个文件有什么特别不能碰的地方?我无法删除它。我无法更改它的权限。我无法更改它的所有者。
目录好像没问题。它有剩余空间,它不是以只读方式安装的。事实上,我可以编辑同一目录中的其他文件。
# ls -ld /etc/frontview/apache
drwxr-xr-x 8 admin admin …
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种在通过 SSH 登录远程机器时执行本地命令的方法。(我想在命令完成后保持登录状态。)换句话说,我想在我的命令行上指定命令。它应该在远程机器上执行,然后我应该得到shell,就像我正常登录一样。
例如,假设我想/home
在获得 shell 之前安装在远程机器上。我会做这样的事情(效果不佳)
ssh mymachine.example.com 'mount /home ; /bin/bash'
Run Code Online (Sandbox Code Playgroud)
实际上,我正在寻找一种如何将以下两个命令压缩为一个的方法:
ssh mymachine.example.com 'mount /home'
ssh mymachine.example.com
Run Code Online (Sandbox Code Playgroud)
有人知道该怎么做吗?
重要提示:我不想在远程机器上存储要执行的命令。它必须存储在本地(也许它包含我解密加密家庭的密码。)
从命令行修改配置文件时,我经常想在配置文件中找到设置并在该设置存在时修改该行。如果该设置不存在,我想将其添加到文件末尾。
我最终做了类似的事情:
if [ `grep -c '^setting=' example.conf` == 0 ]
then
echo "setting=value" >> example.conf
else
sed -i 's/^setting=.*/setting=value/g' example.conf
fi
Run Code Online (Sandbox Code Playgroud)
对于如此简单的事情来说,这似乎是一大堆代码。这甚至没有做一些基本的事情,比如在追加之前检查配置文件是否已经以新行结尾。当然有一个实用程序可以做到这一点,或者我可以使用一个更简单的命令。
如何更改目录以及该目录中所有子文件夹的时间戳以反映所包含文件的修改时间?
\n\n例如,使用以下目录结构:
\n\n[Jan 9] root\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 [Jan 3] file1\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 [Jan 7] file2\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 [Jan 6] sub1\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 [Jan 2] file3\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 [Jan 1] file4\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 [Jan 4] sub2\n \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 [Jan 8] file5\n
Run Code Online (Sandbox Code Playgroud)\n\n这是生成该内容的单行代码:
\n\nmkdir -p root/sub1 root/sub2 && touch -d '2018-01-08' root/sub2/file5 && touch -d '2018-01-04' root/sub2/ && touch -d '2018-01-01' root/sub1/file4 && touch -d '2018-01-02' root/sub1/file3 && touch -d '2018-01-06' root/sub1/ && touch -d '2018-01-07' root/file2 && touch -d '2018-01-03' root/file1 && touch -d '2018-01-09' root/\n
Run Code Online (Sandbox Code Playgroud)\n\n它可以列出 …
我有一个正在使用脚本处理的声源列表。一个例子是:
alsa_input.usb-AVEO_Technology_Corp._USB2.0_Camera-02-Camera.analog-mono
alsa_input.pci-0000_00_14.2.analog-stereo
alsa_input.usb-Plantronics_Plantronics_GameCom_780-00-P780.analog-stereo
Run Code Online (Sandbox Code Playgroud)
我想按任意位置的子字符串对它们进行排序。
例如,我想sort --by usb file.txt
首先放置 USB 设备(同时保留它们的顺序):
alsa_input.usb-AVEO_Technology_Corp._USB2.0_Camera-02-Camera.analog-mono
alsa_input.usb-Plantronics_Plantronics_GameCom_780-00-P780.analog-stereo
alsa_input.pci-0000_00_14.2.analog-stereo
Run Code Online (Sandbox Code Playgroud)
而且我希望能够指定多个子字符串以获得更细粒度的优先级。因此sort --by Platronics --by usb file.txt
将首先放置包含“Platronics”的任何行,然后是包含“usb”的行,然后是其余的行。
我可以使用任何类型的命令行实用程序完成此操作吗?
我的命令看起来像这样
find $PATH -name '$FILE.log' > /tmp/file-list.txt
Run Code Online (Sandbox Code Playgroud)
我不断收到一条错误消息,上面写着
find: illegal option -- n
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么?
我用来df
检查我安装的文件系统是否接近满。我有一个 cron 作业,如果其中任何一个的使用率超过 90%,它就会向我发送电子邮件。
问题是一些应用程序(Ubuntu 发行版)现在使用 snap 来安装,它会创建一个专门为该应用程序安装的只读文件系统。正如 所报告的,它们始终是 100% 满的df
。我想这是合适的,因为它们是只读的并且无法变得更完整。我想将它们从df
输出中排除。
df
有一个-x, --exclude-type=TYPE
命令行标志,看起来可能会有帮助,但手册页没有记录可能的值,TYPE
所以我不确定是否可以使用它来排除只读文件系统。
df
以下是我的一个系统上的输出示例:
$ df --output=pcent,target
Use% Mounted on
0% /dev
1% /run
7% /
1% /dev/shm
1% /run/lock
0% /sys/fs/cgroup
100% /snap/gnome-3-26-1604/74
100% /snap/gnome-characters/139
100% /snap/core/5662
100% /snap/gnome-system-monitor/57
100% /snap/gnome-calculator/238
100% /snap/gnome-logs/45
100% /snap/gtk-common-themes/701
100% /snap/core/5742
Run Code Online (Sandbox Code Playgroud)
这是我的由 cron 运行的脚本:
#!/bin/bash
set -e
THRESHOLD_PERCENT=90
host=`hostname -f`
df --output=pcent,target | while read line
do
if [[ "$line" != …
Run Code Online (Sandbox Code Playgroud) files ×4
command-line ×2
find ×2
permissions ×2
scripting ×2
shell-script ×2
bash ×1
disk-usage ×1
ext3 ×1
linux ×1
readonly ×1
reboot ×1
root ×1
snap ×1
sort ×1
ssh ×1
string ×1
timestamps ×1