我有一个定期获取大量睡眠php进程的网站。我的托管服务设置了20个并发运行进程的限制。如果超过限制,我的网站会因503错误而停止运行。
这种情况很少发生,似乎与访问我网站的人数没有任何关联。
作为一个安全措施,我想拥有一个带有PHP脚本的cron作业,该脚本可以杀死已经睡眠超过10分钟的php进程。
我有一个php函数可以杀死所有睡眠时间超过10分钟的睡眠MySql进程;
public function kill_sleeping_mysql_processes()
{
$result = $this->db->query("SHOW FULL PROCESSLIST");
foreach($result->result_array() as $row)
{
if ($row['Command'] == "Sleep" && $row['Time'] > 600)
{
$this->db->query("KILL {$row['Id']}")
}
}
}
问题是如何使用php进程执行相同的操作?
我可以使用此代码读取php进程。
exec("ps aux | less", $output);
如果我有pid,我可以用这段代码杀死特定的php进程;
$pid = 11054;
exec("kill -9 $pid");
但是我怎样才能有选择地杀死已经睡了10多分钟的php进程?
答案 0 :(得分:0)
private void btnSaveActionPerformed(java.awt.event.ActionEvent evt) {
row = table.getSelectedRow();
int column = table.getColumnCount();
try {
Conn();
System.out.print(table.getValueAt(row,0));
pStmt = conn.prepareStatement("update customer_tbl set LName = '" + txtLname.getText() + "', FName= '"
+ txtFname.getText() + "', Address = '" + txtAddress.getText() + "', ContactNumber = '"+txtContact.getText()
+ "', Age = '" + txtAge+"' WHERE Name_ID = '" + table.getValueAt(row,0) + "'");
// st = conn.createStatement();
// rs = st.executeQuery("UPDATE customer_tbl SET Fname = '"+txtFname.getText()+"' Lname= '"+txtLname.getText()+"', Age = '"+txtAge.getText()+"', Address = '"+txtAddress.getText()+"', ContactNumber = '"+txtContact+"' WHERE Customer_id = '"+ table.getValueAt(row,0)+"'");
pStmt.executeUpdate();
JOptionPane.showMessageDialog(null,"Update success !");
//FillList();
}
我相信必须有更好的方法来做到这一点。
有人可以解释为什么读出时00:01似乎转化为6分钟?
public function kill_dormant_php_processes()
{
$output_array = array();
exec("ps aux | grep -v grep", $ps_output);
array_shift($ps_output);
if (count($ps_output) > 0)
{
$i = 0;
foreach ($ps_output as $ps)
{
$ps = preg_split('/ +/', $ps);
$output_array[$i]->pid = $ps[1];
$output_array[$i]->stat = $ps[7];
$output_array[$i]->time = $ps[9];
$i++;
}
}
if( ! empty($output_array))
{
foreach ($output_array as $row)
{
if( $row->stat == 'S' && date('H:i', strtotime($row->time)) > date('H:i', strtotime('00:01')))
{
exec("kill -9 $row->pid");
}
}
}
}
答案 1 :(得分:0)
作为此处共享的PHP脚本的替代方法,您可以将killall
命令与“早于”时间过滤器一起使用(使用-o
选项)以杀死所有这些进程。
例如,此命令将杀死所有运行了30分钟以上的php-cgi
进程:
killall -o 30m /usr/bin/php-cgi