至少在基于 Debian 的系统下,debianutils包中有一个run-parts实用程序,可用于各种脚本。例如在 /etc/X11/Xsession.conf 中。它将运行在目录中找到的所有可执行文件。为什么需要运行部件而可以与选项或实用程序一起使用?另外,什么是可执行文件?看起来它不是简单地检查文件权限:find-permtestrun-parts
# run-parts --list --lsbsysinit /etc/X11/Xsession.d | tail -1
/etc/X11/Xsession.d/90x11-common_ssh-agent
# ls -l /etc/X11/Xsession.d/90x11-common_ssh-agent
-rw-r--r-- 1 root root 629 2010-11-02 23:17 /etc/X11/Xsession.d/90x11-common_ssh-agent
# head /etc/X11/Xsession.d/90x11-common_ssh-agent
# $Id: 90x11-common_ssh-agent 305 2005-07-03 18:51:43Z dnusinow $
# This file is sourced by Xsession(5), not executed.
STARTSSH=
SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS=
if has_option use-ssh-agent; then
if [ -x "$SSHAGENT" ] && [ -z "$SSH_AUTH_SOCK" ] \
#
Run Code Online (Sandbox Code Playgroud) 我目前正在尝试注册一个脚本(位于 /etc/init.d 中),使该脚本在关机/重启时作为第一个脚本/程序执行(更改为运行级别 0 或 6)。
我曾经update-rc.d stop_servers stop 0 0 6 .为这两个运行级别注册脚本。它在那里正确注册,但名称为K01stop_servers。这使得脚本不会作为第一个被执行。
我基本上需要一切仍在运行。这就是为什么我希望它是第一个。
也就是说,我仍然需要运行我的 apache、mysql 和 (s)ftp 服务器,并且我的 java 仍然功能齐全。
我如何实现这一目标?
脚本如下:
#! /bin/bash
### BEGIN INIT INFO
# Provides: mc_server_safe_shutdown
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start:
# Default-Stop: 0 6
# Description: Shuts down all Minecraft serves softly
### END INIT INFO
/root/.stop_servers
exit 0
Run Code Online (Sandbox Code Playgroud) 我有一个日志文件trace.log,它打印时间戳、线程名称和事务方法以及事务 ID,如下所示。
2014-01-23 15:50:41,724 [catalina-exec-35] INFO TRANSACTION getConnection REQUEST, ID=1308::
2014-01-23 15:50:41,725 [catalina-exec-33] INFO TRANSACTION getConnection REQUEST, ID=1304::
2014-01-23 15:50:41,727 [catalina-exec-10] INFO TRANSACTION getConnection REQUEST, ID=1298::
2014-01-23 15:50:41,727 [catalina-exec-24] INFO TRANSACTION getConnection REQUEST, ID=1307::
2014-01-23 15:50:41,727 [catalina-exec-12] INFO TRANSACTION getConnection DONE, ID=1305::
2014-01-23 15:50:41,733 [catalina-exec-10] INFO TRANSACTION getConnection DONE, ID=1298::
2014-01-23 15:50:41,734 [catalina-exec-26] INFO TRANSACTION getConnection REQUEST, ID=1313::
2014-01-23 15:50:41,734 [catalina-exec-26] INFO TRANSACTION getConnection DONE, ID=1313::
2014-01-23 15:50:41,738 [catalina-exec-39] INFO TRANSACTION getConnection REQUEST, ID=1311::
2014-01-23 15:50:41,733 [catalina-exec-35] INFO …Run Code Online (Sandbox Code Playgroud) 假设我有十个 bash shell 脚本:script1.sh, script2.sh, ..., script10.sh. 最初,所有十个文件都是相同的。
现在,我想对每个脚本进行两个更改:
在每个文件中,我想更改一个特定的行(比如第 8 行)——也就是说,删除第 8 行中的任何内容并将其替换为我指定的“常量”字符串,例如"This is line 8." This is similar to this question,但他们想取代"AAA"有"BBB",而我想,以取代8号线(不管它是什么)"This is line 8."。
在每个文件中,我想更改另一行(比如第 21 行)并将其替换为我指定的“变量”字符串。例如,在script1.sh我想将第 21 行更改为"XYZ"; 在script2.sh我想将第 21 行更改为"PQR"; 并且script3.sh我想将第 21 行更改为"ABC". 本质上,这只是对上面(1) 中函数的多次调用——除了我将在一个单独的文件中而不是在所有文件中进行更改,并且我指定了十个不同的字符串而不是一个。所以为了在这里获得(2),也许我会用不同的参数调用(1)十次不同的时间。
我感兴趣的是使用常用的Linux程序类似的解决方案bash,vi,awk, …
我使用 kdialog 创建了一个 bash 脚本(它在 Kubuntu 12.04 上运行)。GUI 用于每个用户交互(在第一个之后)。但是,脚本仍然必须从终端启动并且终端仍然可见,即使用户不需要读取终端输出或在终端中输入任何内容。有没有一种简单的方法可以进入下一步并使我的 bash 脚本看起来 100% 像 KDE Gui 应用程序?
从下面 slm 和 Ilya Ananyev 的初步回答中,我看到制作 .desktop 文件可以实现这一点。这对我来说非常神奇,这就是我一直在寻找的简单答案。(我想要一个我可以在午餐时间完成的任务,并在剩下的时间里使用我的 bash 脚本来看起来像一个真正的 GUI 应用程序。).desktop 文件对于这个问题的其他读者来说也可能是正确的答案。
但是,在我的特定情况下,该脚本是一个安装程序脚本。所以我发现自己处于第 22 条军规中。如何安装 .desktop 文件以启动我的安装程序,而用户不必先为 .desktop 文件运行另一个安装程序?
此外,就我而言,该脚本由不了解计算机的最终用户使用。最终用户根据我的建议购买了一台预装了 Linux 的计算机。我的目标是让他们无需进入终端即可安装我的软件。(很可能他们以前从未见过命令提示符——他们中的一些人甚至不知道如何使用鼠标!)
所以,看起来,我的解决方案需要一些神奇的方式来安装 .desktop 文件,以便用户可以单击它来启动我的安装程序脚本。
总结一下,我的主要要求是:
Terminal=falseset完成此操作。我的脚本中有以下命令:
set -- `getopt -q agvc:l:t:i: "$@"`
...
while [ -n "$1" ]
do
-i) TIME_GAP_BOOT=$2
shift ;;
...
sleep $TIME_GAP_BOOT
Run Code Online (Sandbox Code Playgroud)
使用 调用脚本时-i 2,出现错误
sleep: invalid time interval `\'2\''
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?如何正确格式化参数?
我想编写一个基本上应该运行的初始化脚本
nvm use v0.11.12 && forever start /srv/index.js
Run Code Online (Sandbox Code Playgroud)
作为用户webconfig。nvm是一个在 in 中声明的 shell 函数~webconfig/.nvm/nvm.sh,它通过source ~/.nvm/nvm.shinwebconfig的.bashrc.
我尝试了以下方法:
sudo -H -i -u webconfig nvm
echo "nvm" | sudo -H -i -u webconfig
Run Code Online (Sandbox Code Playgroud)
但他们失败了
-bash:nvm:未找到命令
-bash:第 1 行:nvm:未找到命令
当我在该 shell 中手动运行sudo -H -i -u webconfig并输入时nvm,它可以工作。我究竟做错了什么?
我想要一个 bash 脚本来比较或查找存储在不同位置的多个文件的差异:
下的文件 /tmp/test/
与/home/oldtest/下的文件进行比较
文件/tmp/test/A.txt仅与/home/oldtest/A.txt(与其他文件类似 -B.txt与 比较B.txt)。
如果发现任何更改:状态应为“文件 A.txt 中需要修改”。
我制作了一个可以打开任何应用程序的 Java 程序。假设有一个文件名“*.jpg”,它将允许操作系统识别应用程序的类型,然后打开默认应用程序。另一个例子:假设文件名是“*.flv”,那么它会打开默认的媒体播放器,就像你在 nautilus 中单击一个图标一样,但唯一的区别是它是在命令行中。这是为此的java程序:
import java.awt.*;
import java.io.*;
public class OpenFile{
public static void main(String args[]){
try{
String filename = args[0];
System.out.println(args[0]);
Desktop.getDesktop().open(new File(filename));
}
catch(Exception e){
System.out.println("Sorry an exception occured. Could not perform the operation.");
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在这个脚本会导致性能问题。现在我想写一个 BASH 脚本来完成这个任务??
我设计了一个基于数组的缓冲区来存储数据并在行计数器达到 MAX 值时写入数据,而不是显示(或写入)每个生成的结果。这是脚本:
#!/bin/bash
#Buffer Management
BUFFERCURSOR=0
BUFFERMAXSIZE=5
function bufferReset (){
unset BUFFERVAR
BUFFERCURSOR=0
}
function bufferAppend () {
(( BUFFERCURSOR++ ))
BUFFERVAR[$BUFFERCURSOR]="$1"
}
function bufferDisplay () {
for ((i=1;i<=$BUFFERCURSOR;i++)); do printf "%s\n" "${BUFFERVAR[$i]}" ; done
}
#Buffer Management End:
for ((i=1;i<=8;i++)) ; do
line=`printf "%3s" "$i ==> $(echo $i | md5sum|awk '{print $1}')"` #Example of a string to append
bufferAppend "$line"
if [ "$BUFFERCURSOR" == "$BUFFERMAXSIZE" ] ; then
bufferDisplay
bufferReset
fi
done
# Display …Run Code Online (Sandbox Code Playgroud) bash-script ×10
bash ×6
shell-script ×2
application ×1
awk ×1
cut ×1
debian ×1
dialog ×1
file-opening ×1
function ×1
getopts ×1
grep ×1
gui ×1
init.d ×1
kde4 ×1
reboot ×1
shutdown ×1
sudo ×1
vi ×1