我编写了一个Bash脚本,它试图找到一个进程并在它停止时运行该进程。 这是剧本。
#!/bin/bash
process=thin
path=/home/deepak/abc/
initiate=thin start -d
process_id=`ps -ef | pgrep $process | wc -m`
if [ "$process_id" -gt "0" ]; then
echo "The process process is running!!"
else
cd $path
$initiate
echo "Oops the process has stopped"
fi
这很好用,我想使用数组,以便我可以形成一个循环使用此脚本来检查多个进程。所以我像这样修改了我的脚本
#!/bin/bash
process[1]=thin
path[1]=/home/deepak/abc/
initiate[1]=thin start -d
process_id=`ps -ef | pgrep $process[1] | wc -m`
if [ "$process_id" -gt "0" ]; then
echo "Hurray the process ${process[1]} is running!!"
else
cd ${path[1]}
${initiate[1]}
echo "Oops the process has stopped"
echo "Continue your coffee, the process has been stated again! ;)"
fi
如果我运行此脚本,我会收到此错误。
DontWorry.sh: 2: process[1]=thin: not found
DontWorry.sh: 3: path[1]=/home/deepak/abc/: not found
DontWorry.sh: 4: initiate[1]=thin start -d: not found
我谷歌搜索找到任何解决方案,大多数人坚持使用“#!/ bin / bash”而不是“#!/ bin / sh”。我试过了两个但没什么用。我错过了什么?
答案 0 :(得分:0)
我实际上并不知道你可以像这样设置数组。我一直用:
pax> initiate=("thin start -d" "xx")
pax> echo ${initiate[0]}
thin start -d
pax> echo ${initiate[1]}
xx
您可能需要字符串周围的引号。在我的bash
(4.0.33),
initiate[1]=thin start -d
被解释为“set initiate [1] = thin然后run start -d”,因为你可以:
fspec=/etc/passwd ls -al ${fspec}
为单个命令设置环境变量。您正在运行什么版本的bash
(使用bash --version
)?
更新
Deepak,我已经让这个脚本在与bash
相同的版本下运行了。请参阅以下成绩单:
pax> bash --version
GNU bash, version 3.2.48(21)-release (i686-pc-cygwin)
Copyright (C) 2007 Free Software Foundation, Inc.
pax> cat qq.sh
#!/bin/bash
process=(sleep)
path=(/)
initiate=("sleep 3600")
process_id=`ps -ef | pgrep ${process[0]} | wc -m`
if [ "$process_id" -gt "0" ]; then
echo "Hurray the process ${process[0]} is running!!"
else
cd ${path[0]}
${initiate[0]} &
echo "Oops the process has stopped"
echo "Continue your coffee, the process has been stated again! ;)"
fi
pax> ./qq.sh
Oops the process has stopped
Continue your coffee, the process has been stated again! ;)
pax> ./qq.sh
Hurray the process sleep is running!!
pax> ps -ef
UID PID PPID TTY STIME COMMAND
pax 112 1 con 10:16:24 /usr/bin/bash
pax 4568 1 con 10:23:07 /usr/bin/sleep
pax 5924 112 con 10:23:18 /usr/bin/ps
您可以在自己的环境中尝试修改后的脚本,看看它是如何进行的吗?
答案 1 :(得分:0)
Deepak Prasanna,您可能想重新考虑监控过程的方式。
lhunath gives reasons没有使用ps
来监控/重启进程,还有
一个简单的脚本包装器,以更清洁的方式实现目标。
答案 2 :(得分:0)
也许是这样的:
#!/usr/bin/perl -w
use strict;
my @processes = ({process=>'thin',
path=>'/home/deepak/abc/',
initiate=>'thin start -d'
},
# more records go here...
);
for $p (@processes) {
my $cmd = 'ps -ef | pgrep ' . $p->{process} . ' | wc -m';
if (`$cmd` > 0) {
print "The process process is running!!\n";
} else {
exec('cd ' . $p->{path} . '; ' .
$p->{$initiate}. '; '.
'echo Oops the process has stopped');
}
}